1. 程式人生 > >單鏈表的遞迴實現

單鏈表的遞迴實現

可以將單鏈表看成是遞迴定義的,每個結點的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);
        }