1.LinkedList是个双向循环链表。见下图:
2.下面自己照jdk写个简单例子:
//首先是链表的结点的数据结构结构
static class Entry<E> {
E element; // 存放的元素
Entry<E> next; // 指向下一个 Entry节点
Entry<E> previous; // 指向上一个Entry节点
Entry(E element, Entry<E> next, Entry<E> previous) {
this.element = element;
this.next = next;
this.previous = previous;
}
}
//下面是链表的实现
public class MyLinkedList<E> {
// 头结点,一个标识,靠它来进入链表
private transient Entry<E> header = new Entry<E>(null, null, null);
private transient int size = 0;
public MyLinkedList() {
// 构造,下一个和前一个都指向自身,见上图的空链表
header.next = header.previous = header;
}
// 添加到头部,可以添加空值
public void addFirst(E e) {
addBefore(e, header.next);
}
private Entry<E> addBefore(E e, Entry<E> entry) {
/*
* 1.空链表情况:newEntry的next指向header,newEntry的previous指向header。[header空时: next和previous都指向header]
* 2.非空链表情况:newEntry的next指向header的next,newEntry的previous指向header.next.previous 就是header本身
*/
Entry<E> newEntry = new Entry<E>(e, entry, entry.previous);
/*
* 1.空链表情况:newEntry.previous就是header 它的next指向newEntry
* 2.非空链表情况:newEntry.previous就是header 让header.next指向newEntry
*/
newEntry.previous.next = newEntry;
/*
* 1.空链表情况:newEntry.next上面已经指向了header 所以就是让header的previous也指向newEntry
* 2.非空链表情况:newEntry.next 是header的previous ,
* 所以就是让header的前一个结点的previous指向newEntry
*/
newEntry.next.previous = newEntry;
size++;
// 如看不懂,见对着上面的图就能分析清楚
return newEntry;
}
public void addLast(E e) { // 自己根据addFirst可以分析出来
addBefore(e, header);
}
public boolean remove(Object o) {
for (Entry<E> e = header.next; e != header; e = e.next) {//遍历链表
if (o.equals(e.element)) { //找到了这个结点
remove(e);//该表指针关系
return true;
}
}
return false;
}
private E remove(Entry<E> e) {
E result = e.element;
//这个结点的上一个结点的下一个指向这个结点的下一个,就是把它的上一级的关系给踢出了
e.previous.next = e.next;
//这个结点的 下一个结点 的 上一个 指向 这个结点的前一个结点, 就是踢出了 下一级的关系
e.next.previous = e.previous;
e.next = e.previous = null;//清除
e.element = null; // 清除
size--;
return result;
}
}
好了基本就是这样,其实就是数据结构中的双向循环链表,大学学过数据结构的都应该明白。
老生常谈:深圳有爱好音乐的会打鼓(吉他,键盘,贝斯等)的程序员和其它职业可以一起交流加入我们乐队一起嗨。我的QQ:657455400