單鏈表的逆序實現,遞歸和非遞歸算法

這個也是很常見的面試題目。

剛開始見過,開了一下別人寫的以爲理解了,讓我自己寫,我才發現原來裏面的細節是很多的,可以說,你也許大概懂算法在幹什麼,可是,你若如果不注意細節,根本體會不到算法裏面的每一行的意思,今天就是看了別人一個算法,被誤導了,怎麼都沒理解他的意思。結果看了10幾篇,果然他裏面漏了點東西,引導我越陷月深,所以,非要弄清楚,看了好多人寫的東西。

我只能說都大致相同,可是有很多細節都沒注意到,一看就是粘貼過來的,裏面的沒思考。爲了不誤導大家,這裏貼下兩種算法。

非遞歸算法,你只要理解整個過程怎麼一個一個斷開,一個一個鏈接起來的,就還算法容易理解

而遞歸算法,我只能說,你不畫一個遞歸樹圖,你根本反應不過來在幹什麼,我也是看了很多人寫的,內容,圖解分析才明白的。如下:

class Test4{
	class Node{
		int value;
		Node next;
	}
	Node reverse(Node head){
		if(head==null||head.next==null)return head;
		Node p1,p2,p3;
		p1=head;
		p2=head.next;
		head.next=null;
		while(p2!=null){
			p3=p2.next;
			p2.next=p1;
			p1=p2;
			p2=p3;
		}
		return p2;
	}
	Node reverseWithRecursive(Node head){
		if(head==null||head.next==null)return head;
		Node p,q;
		p=head.next;
		q=reverseWithRecursive(head.next);
		p.next=head;
		head.next=null;
		return q;
	}
}

簡單補充幾句,非遞歸

p1記錄當前節點的前一個節點上是什麼?

p2就是當前節點,最後一個節點,也就是最後逆序以後的頭結點。

p3結點用來保存p2結點的下一個節點關係的中間變量。

大概過程就是,斷開後面的節點,連接到前面,直到最後一個,他的最後爲null,就返回了。

注意對於head頭結點的處理,直接讓他的next爲null了,這裏最好有個圖,就更能很好的理解了。

遞歸

對於遞歸真的比較巧妙了,遞歸的思想。

別問我啥是遞歸的思想

利用2個節點p,q(之前一直沒明白p是個什麼的?)

p其實記錄的就是第一個節點的信息,q則就是遞歸以後的最後一個節點。

這裏要處理head結點,爲什麼?自己思考

第一個節點p要反鏈接到head頭結點上面

最後處理head結點爲null


如果,你真的明白這個過程,那麼遞歸就理解的比較深入了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章