JAVA基礎整理(五)---手寫簡單的linkedlist來學習linkedlist

LinkedList類

鏈表容器也是經過對比jdk源碼進行對比學習。

1.定義結點類型

class Node<E>{java

E item;
Node<E> next;
Node<E> prev;

Node(Node<E>prev,E item,Node<E>next){
    this.prev=prev;
    this.next=next;
    this.item=item;
}
Node(E item){
    this.item=item;
}

}
node

private static class Node<E> {安全

E item;
Node<E> next;
Node<E> prev;

Node(Node<E> prev, E element, Node<E> next) {
    this.item = element;
    this.next = next;
    this.prev = prev;
}

}
函數

分析:

(1)Node的訪問權限是private的,由於這這是鏈表內部使用的結點類。學習

(2)一開始不理解結點的構造函數爲何要傳入prev和next,但其實就是結點的最簡單的全參構造,不知道時傳null便可,等結點插入鏈表時再賦值便可。this

2.增長一個結點(不帶index,直接尾插法)

public void add(Node<E> node){線程

if(first==null){//當鏈表裏沒有一個元素時,頭尾都是該結點,而且該結點的先後都是空的。
    first=node;
    last=node;
    node.prev=null;
    node.next=null;
}
else {//尾結點是該結點的前驅結點,該結點是尾節點的後繼結點,更新尾節點。
    node.prev=last;
    last.next=node;
    last=node;
}
    size++;//鏈表長度增長。

}
指針

增長一個結點的步驟(這裏都只考慮尾插法):

1.若是是第一個結點,把它同時給first和last,而且這個結點的先後都是空。code

2.若是不是第一個結點,先把鏈表中的last給這個結點的前驅,把這個結點給鏈表裏last的後繼,而後更新鏈表裏的last結點爲當前的node。element

void linkLast(E e) {

final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
    first = newNode;
else
    l.next = newNode;
size++;
modCount++;

}

(1)插入時傳入的應該是數據,把數據封裝成結點的事應該讓內部去作(這也就是解釋了一開始本身的疑惑,源碼的第二行封裝結點時就是前驅傳入了鏈表的last,後繼傳了null)

(2)其他邏輯差異不大。

3.刪除一個結點(帶index)

public void delete(int index){

size--;
Node<E> current=first;
for(int i=1;i<=index-1;i++){
    current = current.next;
}
if(current.equals(first)){
    first=current.next;
}
if (current.equals(last)){
    last=current.prev;
}
else {
    current.prev.next = current.next;
    current.next.prev = current.prev;
}

}

(都暫不考慮範圍問題)

分析:頭尾位置單獨考慮,其他位置指針指向對應改變便可。

E unlink(Node<E> x) {

final E element = x.item;
final Node<E> next = x.next;
final Node<E> prev = x.prev;

if (prev == null) {
    first = next;
} else {
    prev.next = next;
    x.prev = null;
}

if (next == null) {
    last = prev;
} else {
    next.prev = prev;
    x.next = null;
}

x.item = null;
size--;
modCount++;
return element;

}

邏輯基本相同,此外,刪除時有這麼個操做

f.item = null;
f.next = null; // help GC

help gc 的小方針。

4.修改一個結點的數據

(1)遍歷找到這個index結點

(2)修改item便可

5.查找指定數據

(1)遍歷找到這個index結點

(2)拿出item

<h3>Vector 線程安全的,實現與arraylist相似,只是加了個線程安全,可是帶來的效率低。</h3>

相關文章
相關標籤/搜索