在JAVA中如何建立一個鏈表(頭插法、尾插法)以及反轉鏈表

建立鏈表(頭插法)

咱們知道,在數據結構中鏈表通常有兩個部分:data以及指針域next。
那麼怎麼經過data以及next建立一個鏈表呢?
萬物皆有開端,因此咱們首先須要創立一個頭結點,head。

javascript

public static Node createLinkByHead(Scanner reader)
	{
		Node head=null;
	}

而後咱們將鍵盤錄入的數據經過while循環按照輸入順序一個結點一個結點的賦值給結點.data(這裏咱們將數字爲0設置爲循環的終止條件-----也就是當數值爲0時,while循環中止,鏈表就建立到這裏,並不會把0進行賦值)。每次新建一個結點,head都會變成新建的那個結點,因此最後的結點順序是與錄入順序相反的。java

public static Node createLinkByHead(Scanner input)
	{
		Node head=null;
		int m=input.nextInt();
		while(m!=0)//進行判斷
		{
			Node p=new Node(m);//建立一個新的對象——p結點。
			if(head==null)head=p;//若是頭結點爲空、將P做爲頭結點。
			else
			{
				p.next=head;//此前已經有結點,p結點的next指針域指向head
				head=p;//將head移到如今的p結點
			}
			m=input.nextInt();//讀取下一個數字。
		}
		return head;//返回頭結點
	}

示意圖以下:
頭插法示意圖
數據結構

建立鏈表(尾插法)

尾插法依然換湯不換藥,可是咱們須要多出一個指針用來指向尾部的節點。spa

public static createLinkByTail(Scanner input)
	Node head=null;
	Node Tail=null;
	int m=input.nextInt();

而後咱們錄入第一個節點以後,錄入第二個結點時,head不會再變化,他一直指向第一個錄入的節點,而Tail用來進行以前頭插法head的賦值指針域的操做。指針

public static createLinkByTail(Scanner input)
{
	Node head=null;
	Node tail=null;
	int m=input.nextInt();
	while(m!=0)
	{
		Node p=new Node(m);//建立新的對象。
		if(head==null)tail=head=p;//若是head爲空,那麼至關於第一個結點,將tail順便一塊兒指向這個節點
		else
		{
			tail.next=p;//將當前節點的next指針域指向下一個節點。
			tail=p;//tail後移。
		}
		m=input.nextInt();
	}
	return head;//返回頭結點
}

反轉鏈表

反轉鏈表,咱們腦子裏應該能夠想象獲得怎麼反轉。也就是像下圖:code

反轉鏈表
因此咱們所須要作的就是從head開始經過遍歷(從第一個到最後一個)一個一個去反轉他們的指針,最後將head指向最後一個便可。
整個反轉過程能夠理解成 (head)1->2->3->null 變成 (head)3->2->1->null。

對象

public static reverseLink(head)
{
	Node p=head;//將p做爲第一個節點
	head=null;
	if(p!=null)
	{
		Node q=p.next;//將當前節點指向下一個結點的指針保存到q裏。
		p.next=head;//將當前結點指向原來的上一個結點
		head=p;//將head後移一個結點;
		p=q;//把開始指向的位置賦給p,能夠當作p=p.next(原來的);
	}
	return head
}

這是個人第一篇博客,若有描述的不對,煩請各位指出,多多包涵!謝謝你們。blog

相關文章
相關標籤/搜索