標籤:
java實現迴圈鏈表:http://www.cnblogs.com/lixiaolun/p/4643911.html
在單鏈表中,查詢下一個元素的時間是O(1)。查詢上一個元素的時間卻是O(n)。
為了克服這種缺點,我們開始學習雙向鏈表。
雙向鏈表類的代碼:
package doublelinkedlist;public class DoubleLinkedList {class Element{private Element prior=null;public Object value=null;private Element next=null;}private Element header = null;//頭結點/** * 初始化鏈表 * */void initList(){header = new Element();header.prior=header;header.value=null;header.next=header;}/** * 向鏈表中第i個位置插入元素o * */void insertList(Object o,int i){if(i<=0||i>size()){System.out.println("插入位置不合法!鏈表長度為:"+size());}else{Element e = new Element();e.value=o;if(header.prior==header)//第一次插入元素{e.prior=header;e.next=header;header.next=e;header.prior=e;}else if(i==size())//在最後插入{System.out.println("在鏈表尾部插入");e.next=header;e.prior=header.prior;header.prior.next=e;header.prior=e;}else{Element temp = header;int count=0;while(temp.next!=header){count++;if(count == i){e.prior=temp;e.next=temp.next;temp.next.prior=e;temp.next=e;}temp=temp.next;}}}}/** * 刪除鏈表中的某個元素 * */void deleteList(int i){if(i<=0||i>size()){System.out.println("插入位置不合法!鏈表長度為:"+size());}else{int count=0;Element temp = header;while(temp.next!=header){temp=temp.next;count++;if(i==count){//刪除第i個元素temp.next.prior=temp.prior;temp.prior.next=temp.next;}}}}/** * 列印鏈表 * */void print(){System.out.print("列印雙向迴圈鏈表:");Element temp = header;while(temp.next!=header){System.out.print(temp.next.value+"\t");temp=temp.next;}System.out.println();}/** * 擷取鏈表的大小 * */int size(){int count=1;Element temp = header;while(temp.next!=header){count++;temp=temp.next;}return count;}}
雙向鏈表的測試類別
package doublelinkedlist;public class DoubleLinkedListMain {public static void main(String[] args) {DoubleLinkedList dlList = new DoubleLinkedList();//有頭結點dlList.initList();dlList.insertList(1, 1);dlList.insertList(2, 2);dlList.insertList(3, 1);dlList.insertList(4, 1);dlList.insertList(5, 1);dlList.insertList(6, 6);dlList.print();dlList.deleteList(3);dlList.print();}}
java實現雙向鏈表