可以將單鏈表看成是遞迴定義的,每個結點的next域指向由後諸結點組成的一條子單鏈表,最後乙個結點的next域指向空鍊錶。此時可以將單鏈表寫成遞迴演算法。
1、構造空鍊錶
public
class linkedrecursion}
2、根據陣列構造單鏈表
//根據指定陣列構造鍊錶
public
linkedrecursion(t element)
}private nodecreate(t element, int i)
return p;
}
執行過程如下:這裡假設陣列長度為3。
遞迴的過程相當於從最後乙個結點開始一次往前推進,每次遞迴返回結果在下一次遞迴時使用,所以我們從i=3,開始看起。
i=3,此時返回值為結點p,且p=null;
i=2, create(element,2+1)函式返回結點null
此時 p.next=create(element,2+1);
i=1,create(element,1+1)函式返回結點2
此時 p.next=create(element,1+1);
i=0, create(element,0+1)函式返回結點1
此時 p.next=create(element,0+1);
所以this.head.next=create(element,0);建立了乙個鍊錶。
3.鍊錶的深拷貝(從鍊錶構造單鏈表)
//根據單鏈表構造單鏈表 深拷貝
public
linkedrecursion(linkedrecursionlist)
private nodecopy(nodep)
return q;
}
執行過程:
假設list長度為3
i=3時,copy函式返回的q結點是null;
i=2時,q=new node(p.data,null);
q.next=copy(p.next);導致
i=1時,q=new node(p.data,null);
q.next=copy(p.next);導致
i=0時,,q=new node(p.data,null);
q.next=copy(p.next);導致
所以當遞迴結束後,拷貝了整個鍊錶。
4、判斷是否相等
public
boolean
equals(object obj)
return
false;
}private
boolean
equals(nodep, nodeq)
5、列印整個鍊錶
public string tostring()
private string tostring(nodep)
return str+this.tostring(p.next);
}
單鏈表的遞迴與非遞迴實現
一 遞迴版本 1 class linklist 2 9 10 private linknode head 11 12 public void add int data 13 17 18 else 19 22 23 24 public void add linknode node,int data 2...
單鏈表遞迴
以前覺得遞迴太麻煩,指標方便多了,於是乎單鏈表的題目都是用迭代呀,雙指標呀來做的。這次突破下自己,將單鏈表的遞迴掰扯一下,等下會用乙個簡單的小題目來作為例子 我先講一下平常遞迴的流程,方便待會單鏈表遞迴的理解 題目 輸入乙個數字 n 123,列印出1,2,3 void print n 執行流程圖 鍊...
單鏈表反轉 非遞迴 遞迴方式實現
鍊錶的翻轉是程式設計師面試中出現頻度最高的問題之一,常見的解決方法分為遞迴和迭代兩種。最近在複習的時候,發現網上的資料都只告訴了怎麼做,但是根本沒有好好介紹兩種方法的實現過程與原理。所以我覺得有必要好好的整理一篇博文,來幫忙大家一步步理解其中的實現細節。我們知道迭代是從前往後依次處理,直到迴圈到鏈尾...