前面已經總結了單向鍊錶,有興趣的兄弟可以進我部落格看一下。
大家對比就可以看出,實現同樣的功能單向鍊錶要比雙向鍊錶痛苦的多。所以呀不斷地總結前輩留下的東西,是社會進步的基礎呀。可以直接看linkedlist的原始碼,其就是個雙向鍊錶。
一、雙向鍊錶的結構。
(1)、首先節點的結構,其中包含本節點內容,同時需要知道前面是誰後面是誰。
private static class entry
}
其中e則指向本節點的元素,而nextentry則指向下乙個節點,previousentry則指向前乙個節點。
(2)、需要定義乙個節點,其同時知道表頭,同時知道表尾,這裡就暫時定義為head。
private transient entryhead = new entry(null, null, null);
public doublechain()
可以看出,在初始化方法中,直接將表頭和表尾直接都指向head。這樣在head的基礎上不管怎麼增加元素都逃脫不了與head關係。牢記head.nextentry表頭,head.previousentry表尾。
(3)、同樣記錄節點的個數只是為了提高效率,不是必要。
private int size;
public int size()
好了有這三樣,就足夠了。就看我們如何用他們了。
二、內部實現。
(1)、方法addbefore。由於一開始就初始化了head,有了head作為基準,玩轉整個鍊錶也就靠這個方法了。
private void addbefore(e e, entryentry)
可以看出,通過指定的元素建立乙個新的節點。然後將其前前後後的關係都打通就好了。
(2)、表頭插入。再簡單不過了,直接在head.nextentry前增加就好了,直接呼叫addbefore。效率高
public void addhead(e e)
(3)、尾插入。同樣簡單,直接在head.previous前增加就好了,同樣呼叫addbefore。效率高
public void add(e e)
(4)、指定節點插入(插隊)。同樣需要插隊,但是由於其節點的雙向性,則不需要進行特殊處理,直接迴圈找出指定的節點元素就好了。效率低
public void addspecifyindex(e e, int index)
count++;
} }
(5)、指定節點獲取元素。同樣迴圈找出。效率低
public e get(int index)
count++;
} return result;
}
(6)、指定節點刪除。同理,找到要刪除的節點,讓指定節點的前後直接相通就ok了。效率低
public void remove(int index)
count++;
} }
(7)、迴圈。為了好進行遍歷演示,下面的就是迴圈遍歷所用的了,大家隨意看一下就好了。
private entrycurrent;
public boolean hasnext()
public e next()
public void setcursor(int index)
count++;
}
三、測試。。乙個main方法,測試一下。
public static void main(string args)
// 頭插入
// doublechain.addhead("head");
// // 尾插入
// doublechain.add("tail");
// // 指定節點插入
// doublechain.addspecifyindex("specify", 1);
// // 指定節點刪除
// doublechain.remove(3);
// // 設定迴圈的初始節點
// doublechain.setcursor(0);
int count = 0;
system.out.println("######size" + doublechain.size() + "#######");
while (doublechain.hasnext())
system.out.println(doublechain.get(doublechain.size() - 2));
}
四、總結。。
可以看出,從結構上講,雙向鍊錶和單項鍊表最大的區別在於每個節點都是雙向的。從效率上講,提高了尾插入的效率,但是對於插隊同樣效率不高。如果需要反覆進行插隊操作的同學注意了,linkedlist的效率會很低的哦。
五、全部**。。
package paladin.chain;
public class doublechainimplements chain
private void addbefore(e e, entryentry)
public void add(e e)
public void addhead(e e)
public void addspecifyindex(e e, int index)
count++;
} }public void remove(int index)
count++;
} }public e get(int index)
count++;
} return result;
} public boolean hasnext()
public e next()
public void setcursor(int index)
count++;
} }public int size()
private static class entry
} public static void main(string args)
// 頭插入
// doublechain.addhead("head");
// // 尾插入
// doublechain.add("tail");
// // 指定節點插入
// doublechain.addspecifyindex("specify", 1);
// // 指定節點刪除
// doublechain.remove(3);
// // 設定迴圈的初始節點
// doublechain.setcursor(0);
int count = 0;
system.out.println("######size" + doublechain.size() + "#######");
while (doublechain.hasnext())
system.out.println(doublechain.get(doublechain.size() - 2));
}}
java實現雙向鍊錶
實現類,只實現了幾個比較簡單的功能 package 鍊錶.雙向鍊錶 program 資料結構 description 雙向鍊錶的實現 author zhongyusen create 2019 05 31 21 45 public class mylinklist public void add o...
雙向迴圈鍊錶 java實現
雙向迴圈煉表示意圖 雙向迴圈鍊錶實現 public class doublelink private int size 鍊錶長度 public nodehead 頭節點 constructor public doublelink 獲取鍊錶的長度 return public int size 判斷鍊錶...
用java實現雙向鍊錶
判斷指定索引是否合法 param index return public boolean islinkindex int index 根據指定索引取得具體節點 param index return public node node int index return temp else return ...