编写双向循环链表,实现:追加、插入、删除、遍历
##直接源代码
public class LinkedList<E>{
private Node head;
private int size;
private class Node{
E data;
Node prev;
Node next;
public Node(E e) {
data = e;
}
}
//向集合中追加元素
public boolean add(E e) {
if(head==null) {
head = new Node(e);
//建立双向循环关系
head.next = head;
head.prev = head;
}else {//第二个以后的节点
Node last = head.prev;
Node node = new Node(e);
last.next = node;
node.next = head;
head.prev = node;
node.prev = last;
}
size++;
return true;
}
public int size() {
return size;
}
public E get(int index) {
if(index<0 || index > size-1) {
throw new IndexOutOfBoundsException("越界!"+index);
}
return find(index).data;
}
public E remove(int index) {
if(index<0 || index > size-1) {
throw new IndexOutOfBoundsException("越界!"+index);
}
if(size==1 && index==0) {
E e = head.data;
head=null;
size=0;
return e;
}
Node node = find(index);
Node prev = node.prev;
Node next = node.next;
prev.next = next;
next.prev = prev;
node.next = null;
node.prev = null;
if(index==0) {
head=next;
}
size--;
return node.data;
}
public boolean add(int index, E e) {
if(index<0 || index>size) {
throw new IndexOutOfBoundsException("越界!"+index);
}
if(index==size) {
return add(e);
}
Node node = find(index);
Node prev = node.prev;
Node next = node;
Node n = new Node(e);
prev.next = n;
n.next = next;
next.prev = n;
n.prev = prev;
if(index==0) {
head=n;
}
size++;
return true;
}
private Node find(int index) {
Node node;
if(index < size/2) {
node = head;
for (int i = 0; i < index; i++) {
node = node.next;
}
}else {
node=head.prev;
for(int i=size-1;i>index;i--){
node=node.prev;
}
}
return node;
}
public String toString() {
// []
// [8, 9, 5, 6, 7]
if(head==null) {
return "[]";
}
StringBuilder buf = new StringBuilder("[");
buf.append(head.data);
Node node = head.next;
while(node != head) {
buf.append(", ").append(node.data);
node = node.next;
}
return buf.append("]").toString();
}
}
##测试代码
public class LinkedListTest {
public static void main(String[] args) {
LinkedList<String> list =
new LinkedList<String>();
list.add("Tom");
list.add("Jerry");
list.add("Andy");
list.add("Mac");
list.add("Wang");
System.out.println(list);
list.add(1,"光头强");
System.out.println(list);
list.add(4, "熊大");
list.add(0, "熊二");
System.out.println(list);
list.remove(0);
System.out.println(list);
}
}