java中的順序連結串列,單鏈表,雙鏈表,迴圈連結串列
阿新 • • 發佈:2018-12-05
今天昨天學了集合框架,但是在List介面下有兩個子類涉及到了連結串列,書上又提到了一個關鍵的詞“雙向迴圈連結串列”,折騰了一整天終於搞懂了。
首先我們得明白什麼是連結串列,連結串列是環環相扣的一組資料,而我們常用的陣列就是一組順序連結串列,在分配記憶體時記憶體將對陣列分配一組”連續的記憶體空間“而這個記憶體空間是固定的是程式啟動前就設定好的大小,但是這樣做的弊端就是當對陣列分配1000的記憶體空間若只用了很少的一部分多餘的部分也會佔用記憶體,但是單鏈表很好的解決了這一問題。
單鏈表
連結串列內部的儲存實現是利用遞迴的方式進行儲存的,連結串列中的每一個物件都是一個節點(Node),而每個節點物件中都存在一個數據物件(data)和儲存下一個節點物件的節點物件(next),利用next節點物件實現連結串列之間的關聯。
程式碼如下:
先建立一個節點物件類
package 單鏈表的實現;
public class Node{
public Object data;//用來儲存物件資料
public Node next;//用來儲存下一個節點物件
}
再建立一個list用來實現單鏈表
package 單鏈表的子我實現; import java.util.Collection; import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.ListIterator; import java.util.Spliterator; import java.util.function.Consumer; import java.util.function.Predicate; import java.util.function.UnaryOperator; import java.util.stream.Stream; public class list{ private Node head; public list() { head=new Node(); } public void traverse() { Node temp=head; while(temp.next!=null) { temp=temp.next; System.out.println(temp.data); } } public boolean add(Object e) { // TODO Auto-generated method stub Node temp=head;//將頭部物件賦值給臨時物件,沒有頭部將無法遍歷連結串列 //利用遞迴執行迴圈,當下一個節點物件為空時停止迴圈 /** *注意!! *data中儲存的是當前物件,而next儲存的是下一個物件 *temp=temp.next是將temp的下一個物件賦值給temp */ while(temp.next!=null) { //將物件的下一個物件賦值給現有的臨時物件 //此時被賦值的temp節點物件同樣擁有next物件 //依次類推就形成了單鏈表 temp=temp.next; } Node next=new Node(); next.data=e; temp.next=next; return true; } public Object get(int index) { // TODO Auto-generated method stub Node temp=head; int i=0; while(temp.next!=null) { if(i==index) { return temp.data; } i++; } return null; } public void add(int index, Object element) { // TODO Auto-generated method stub Node temp=head; Node Element=new Node(); Element.data=element; int i=0; while(temp.next!=null) { if(i==index) { Node node=temp.next; temp.next=Element; Element=node; } i++; } } }
再建立一個測試類
package 單鏈表的子我實現;
public class Test {
public static void main(String[] args)
{
list list=new list();
list.add("張三");
list.add("李四");
list.add("王武");
list.add("趙六");
list.traverse();
}
}
執行結果如下:
由於時間的緣故,先寫下單鏈表,之後更新。