1. 程式人生 > >java中的順序連結串列,單鏈表,雙鏈表,迴圈連結串列

java中的順序連結串列,單鏈表,雙鏈表,迴圈連結串列

今天昨天學了集合框架,但是在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();
	}
}

執行結果如下:

 

 

由於時間的緣故,先寫下單鏈表,之後更新。