今天复习一下Java数据结构中最基本的双向链表使用.
下面是自己写的一个简单的链表类.
public class MyLinkedList<E> {
int size;
Linked<E> head;
public MyLinkedList() {
head = new Linked<E>(null, null, null);
head.previous = head;
head.next = head;
}
static class Linked<E> {
E data;
Linked previous;
Linked next;
public Linked(E data, Linked previous, Linked next) {
this.data = data;
this.previous = previous;
this.next = next;
}
}
// 入队
public boolean offer(E e) {
return addLastImpl(e);
}
private boolean addLastImpl(E e) {
Linked<E> old = head.previous;
Linked<E> newLink = new Linked<E>(e, old, head);
head.previous = newLink;
old.next = newLink;
size++;
return true;
}
// 出对
public E poll() {
return size == 0 ? null : removeFirst();
}
private E removeFirst() {
Linked<E> first = head.next;
if (first != head) {
first.next.previous = head;
head.next = first.next;
size--;
return first.data;
}
throw new NoSuchElementException();
}
public int getSize() {
return size;
}
}
测试代码
MyLinkedList<String> linkedList= new MyLinkedList<String>();
linkedList.offer("a1");
linkedList.offer("a2");
linkedList.offer("a3");
linkedList.offer("a4");
loop(linkedList);
System.out.println("--------------------------");
linkedList.poll();
linkedList.poll();
linkedList.offer("a5");
linkedList.offer("a6");
loop(linkedList);
}
private static void loop(MyLinkedList<String> linkedList) {
for (MyLinkedList.Linked linked= linkedList.head.next;linked!= linkedList.head;linked = linked.next) {
System.out.println(linked.data);
}
}
打印结果如下:
a1
a2
a3
a4
a3
a4
a5
a6