循环链表实现集合
public class LoopListNode<E> {
transient Node<E> head;
transient Node<E> rear;
private int size = 0;
public int getSize() {
return size;
}
private void firstNode(E e) {
Node<E> node = new Node<>(e, null);
if (head == null) {
rear = node;
}
head = node;
node.next = head;
size++;
}
private void lastNode(E e) {
Node<E> node = new Node<>(e, null);
if (rear == null) {
rear =node;
head = node;
}
node.next = rear.next;
rear.next = node;
rear = node;
size++;
}
public void add(int index, E e) {
checkPositionIndex(index);
if (size == 0) {
firstNode(e);
} else if (index == size - 1) {
lastNode(e);
} else {
Node<E> node = new Node<>(e, null);
Node<E> preNode = getNode(index - 1);
node.next = preNode.next;
preNode.next = node;
size++;
}
}
private void checkPositionIndex(int index){
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException();
}
}
public E get(int index) {
checkPositionIndex(index);
if(index==0){
return head.ele;
}
return getNode(index).ele;
}
public void remove(int index) {
checkPositionIndex(index);
if (size == 1) {
head = null;
rear = null;
} else if (index == size - 1) {
Node<E> node = getNode(index - 1);
node.next = head;
rear = node;
} else if (index == 0) {
Node<E> ele = head.next;
head.next = ele.next;
ele = null;
}else {
Node<E> preNode = getNode(index - 1);
Node<E> curNode =preNode.next;
preNode.next=curNode.next;
}
size--;
}
private Node<E> getNode(int index) {
Node<E> node=head;
for (int i = 0; i < index; i++)
node= node.next;
return node;
}
public void add(E e) {
lastNode(e);
}
private class Node<E> {
private E ele;
private Node next;
public Node() {
this(null, null);
}
public Node(E data, Node next) {
this.ele = data;
this.next = next;
}
}
}
循环链表示意图