單鏈表的遞迴實現
阿新 • • 發佈:2019-01-29
可以將單鏈表看成是遞迴定義的,每個結點的next域指向由後諸結點組成的一條子單鏈表,最後一個結點的next域指向空連結串列。此時可以將單鏈表寫成遞迴演算法。
1、構造空連結串列
public class LinkedRecursion<T> {
public Node<T>head;
//建構函式,構造空連結串列
public LinkedRecursion(){
this.head=new Node<T>();
}}
2、根據陣列構造單鏈表
//根據指定陣列構造連結串列
public LinkedRecursion(T [] element){
this();
if(element!=null){
this.head.next=create(element,0);
}
}
private Node<T> create(T[] element, int i) {
// TODO Auto-generated method stub
Node<T> p=null;
if(i<element.length){
p=new Node<T>(element[i],null);
p.next=create(element,i+1);
}
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(LinkedRecursion<T> list){
this();
this.head.next=copy(list.head.next);
}
private Node<T> copy(Node<T> p) {
// TODO Auto-generated method stub
Node<T>q=null;
//和連結串列的非遞迴實現類似,同時給出q結點的data域與next域
if(p!=null){
q=new Node<T>(p.data,null);
q.next=copy(p.next);
}
return q;
}
執行過程:
假設list長度為3
i=3時,copy函式返回的q結點是null;
i=2時,q=new Node(p.data,null);
q.next=copy(p.next);導致 並返回結點q
i=1時,q=new Node(p.data,null);
q.next=copy(p.next);導致 並返回結點q
i=0時,,q=new Node(p.data,null);
q.next=copy(p.next);導致 並返回結點q
所以當遞迴結束後,拷貝了整個連結串列。
4、判斷是否相等
public boolean equals(Object obj){
if(obj==this)
return true;
if(obj instanceof LinkedRecursion){
LinkedRecursion<T> list=(LinkedRecursion<T>) obj;
return equals(this.head.next,list.head.next);
}
return false;
}
private boolean equals(Node<T> p, Node<T> q) {
// TODO Auto-generated method stub
if(p==null&&q==null)
return true;
return p!=null &&q!=null && p.data.equals(q.data) &&equals(p.next,q.next);
}
5、列印整個連結串列
public String toString(){
return "("+this.toString(this.head.next)+")";
}
private String toString(Node<T> p) {
// TODO Auto-generated method stub
if(p==null)
return "";
String str=p.data.toString();
if(p.next!=null){
str+=",";
}
return str+this.toString(p.next);
}