Java實現(xiàn)雙向鏈表(兩個版本)
更新時間:2016年02月06日 16:44:28 投稿:mrr
這篇文章主要介紹了Java實現(xiàn)雙向鏈表(兩個版本)的相關(guān)資料,需要的朋友可以參考下
臨近春節(jié),項目都結(jié)束了,都等著回家過年了。下面是小編給大家研究數(shù)據(jù)結(jié)構(gòu)的相關(guān)知識,鏈表算是經(jīng)常用到的一種數(shù)據(jù)結(jié)構(gòu)了,現(xiàn)將自己的實現(xiàn)展示如下,歡迎大神賜教。
第一個版本,沒有最后一個節(jié)點,每次從根節(jié)點開始遍歷
public class LinkedList<E> { private Node head; public LinkedList() { } public E getFirst(){ if(head==null){ return null; } return head.value; } public LinkedList<E> addFirst(E e){ head.pre=new Node(e, null, head); head=head.pre; return this; } public LinkedList<E> addNode(E e){ Node lst=head; if(lst==null){ this.head=new Node(e, null, null); return this; }else{ while(true){ if(lst.next==null){ break; }else{ lst=lst.next; } } lst.next=new Node(e, lst, null); return this; } } public LinkedList<E> remove(E e){ Node lst=head; if(lst==null){ throw new NullPointerException("the LinkedList is empty."); }else{ while(true){ if(e.equals(lst.value)){ //移除這個元素 if(lst.pre!=null){ lst.pre.next=lst.next; } if(lst.next!=null){ lst.next.pre=lst.pre; } lst=null; break; } lst=lst.next; } return this; } } @Override public String toString() { StringBuffer buff=new StringBuffer("["); Node lst=this.head; while(lst!=null){ buff.append(lst.value+","); lst=lst.next; } return buff.substring(0, buff.length()-1)+"]"; } /**節(jié)點信息*/ private class Node{ public Node pre; public E value; public Node next; public Node(E value,Node pre,Node next) { this.value=value; this.pre=pre; this.next=next; } } }
第二個版本,有了最后一個節(jié)點
public class LinkedList<E> { private Node head; private Node last; public LinkedList() { } public E getFirst(){ if(head==null){ return null; } return head.value; } public E getLast(){ if(last==null){ return null; } return last.value; } public LinkedList<E> addFirst(E e){ head.pre=new Node(e, null, head); head=head.pre; return this; } public LinkedList<E> addNode(E e){ Node lst=last; if(lst==null){//如果最后一個節(jié)點是空的則這個鏈表就是空的 this.last=new Node(e, null, null); this.head=this.last; return this; }else{ while(true){ if(lst.next==null){// break; }else{ lst=lst.next; } } lst.next=new Node(e, lst, null); last=lst.next; return this; } } public LinkedList<E> remove(E e){ Node lst=head; if(lst==null){ throw new NullPointerException("the LinkedList is empty."); }else{ while(true){ if(e.equals(lst.value)){ //移除這個元素 if(lst.pre!=null){ lst.pre.next=lst.next; } if(lst.next!=null){ lst.next.pre=lst.pre; } lst=null; break; } lst=lst.next; } return this; } } @Override public String toString() { StringBuffer buff=new StringBuffer("["); Node lst=this.head; while(lst!=null){ buff.append(lst.value+","); lst=lst.next; } return buff.substring(0, buff.length()-1)+"]"; } /**節(jié)點信息*/ private class Node{ public Node pre; public E value; public Node next; public Node(E value,Node pre,Node next) { this.value=value; this.pre=pre; this.next=next; } } }
注:以上兩個版本都沒有考慮在多線程下使用的情況。
以上所述是小編給大家介紹的Java實現(xiàn)雙向鏈表(兩個版本)的相關(guān)知識,希望對大家有所幫助。
相關(guān)文章
詳解Java中的println輸入和toString方法的重寫問題
這篇文章主要介紹了Java中的println輸入和toString方法的重寫,一個對象數(shù)組在調(diào)用Arrays.toString打印時,相當(dāng)于遍歷數(shù)組,然后打印里邊每個對象,這再打印對象就調(diào)用對象自己的toString了,需要的朋友可以參考下2022-04-04