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();
	}
}

運行結果如下:


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



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com