package com.list;
/**
* 数据结构与算法Java表示
* @version 1.0
* @author 小明
*
*/
public class MyLinkedList {
private Node head;// 头结点
private int size;// 长度
public MyLinkedList() {
head = null;// 初始化头节点为空
size = 0;// 初始化长度为0
}
// 重写toString方法
@Override
public String toString() {
String str = "";
Node temp = head;
for (; temp != null;) {
str += temp.getElement() + " ";
temp = temp.getNext();// 后移之末尾
}
str = "[ " + str + "]";
return str;
}
/*
* add方法默认将结点加入到单链表的末尾
*/
public void add(Node node) {
if (head == null) {// 表明此时表为空,不存在头结点
head = node;// 创造头结点
size++;// 长度加一
} else {// 头结点存在
Node temp = head;// 将head赋值给临时变量
while (temp.getNext() != null) {
temp = temp.getNext();// 后移之末尾
}
temp.setNext(node);// 加入节点
size++;// 长度加一
}
}
/*
* 插入函数
*/
public void add(int index, Node node) throws IndexException {
Node temp = head;// 将head赋值给临时变量
if (size == 0) {// 当表为空时调用add加入至表头
add(node);
return;
}
if (index <= 0 || index > size + 1) {// 索引位置不正确
throw new IndexException("索引位置不正确!");
} else {
if (index == 1) {// 插入位置为第一个是处理
node.setNext(head);// 将原来的头节点设置为插入节点的后继
head = node;// 头节点更改
size++;// 长度增加
} else {
if (index == size + 1) {// 此时默认插入表尾
add(node);
} else {// 插入既不是表头也不是表尾时
for (int i = 1; i < index - 1; i++) {
head = head.getNext();// 后移至插入位置前一位
}
node.setNext(temp.getNext());// 将temp的后继赋值给插入节点
temp.setNext(node);// 将temp的后继改为插入节点
size++;// 长度增加
}
}
}
}
/*
* 删除函数
*/
public void remove(int index) throws IndexException {
Node temp = head;// head赋值给temp
if (index <= 0 || index > size) {// 索引位置不正确
throw new IndexException("索引异常");
} else {// 索引正确
if (index == 1) {// 删除第一个元素
head = head.getNext();
size--;//长度减一
} else {
if (index == size) {// 索引正确删除最后一个元素
for (; temp.getNext().getNext() != null;) {// 移至倒数第二个元素
temp = temp.getNext();
}
temp.setNext(null);// 删除最后一个元素
size--;//长度减一
}else {//删除元素不在表头或表尾
for(int i=1;i<index-1;i++) {//后移至删除节点的前一个节点
temp=temp.getNext();
}
temp.setNext(temp.getNext().getNext());//删除
size--;//长度减一
}
}
}
}
public static void main(String[] args) throws IndexException {
MyLinkedList list = new MyLinkedList();
list.add(1, new Node<>("asdas"));
list.add(1, new Node<>("202"));
list.add(new Node<>(85));
System.out.println(list);
list.remove(3);
System.out.println(list);
list.add(2,new Node<>(2154));
System.out.println(list);
}
}
/*
* 结点
*/
class Node<T> {
private T element;// 值域
private Node next;// 指针域
// 节点初始化只可以设置值域
public Node(T element) {
this.element = element;
next = null;
}
// 获取值域
public T getElement() {
return element;
}
// 获取指针域
public Node getNext() {
return next;
}
public void setNext(Node node) {
next = node;
}
}
/*
* 索引异常类
*/
class IndexException extends Exception {
public IndexException() {
}
public IndexException(String s) {
super(s);
}
}