java不用api實現單連結串列反轉(二)

shuaishuai3409發表於2016-02-27

這篇部落格主要講述反轉連結串列相關思路。兩種方法:時間複雜度均為O(n),空間複雜度均為O(1)


方法一:頭插法

頭插法不僅可以建立單連結串列,還可以利用其思路反轉連結串列。首先把頭節點拆下,剩下的節點依次遍歷,採用頭插法,相當於從新建立連結串列。

package singleLinklistReverse;

import singleLinklistReverse.Creat.Lnode;

public  class Reverse {
    Lnode p;
    Lnode r;
    public void reverseLinklist(Lnode first) {
        // TODO Auto-generated method stub
        p=first.next;
        while(p!=null){
            System.out.println(p.data);
            p=p.next;
        }
        p=first.next;
        first.next=null;
        while(p!=null){
            r=p.next;
            p.next=first.next;
            first.next=p;
            p=r;
        }
        p=first.next;
        while(p!=null){
            System.out.println(p.data);
            p=p.next;
        }
    }
}
結果:
12345
5
4
3
2
1
1
2
3
4
5
輸入12345,採用頭插法建立單連結串列,54321是當前連結串列裡的資料;12345是反轉之後的資料。

方法二:正常思維

該方法就是遍歷到某個節點時,將其指向先前的節點,不斷遍歷知道其為空。要注意的是除頭節點外第一個節點指標為空(變為最後一個節點了嘛),要先處理它。然後遍歷完畢後要將頭節點指標指向最後一個節點。(需要三個指標)

/**
 * 
 */
/**
 * @author Administrator
 *
 */
package singleLinklistReverse_2;

import singleLinklistReverse_2.Creat.Lnode;

public class Reverse_2{
    Lnode p,pre,r;
    public void reverseLinklist(Lnode first) {
        // TODO Auto-generated method stub
         p=first.next;
        while(p!=null){
            System.out.println(p.data);
            p=p.next;
        }
        p=first.next;//處理第一個節點
        r=p.next;
        p.next=null;
        pre=first.next;
        while(r!=null){
            p=r;
            r=r.next;
            p.next=pre;
            pre=p;
        }
        first.next=p;
        p=first.next;
        while(p!=null){
        System.out.println(p.data);
        p=p.next;
        }
    }

}
結果:
12345
1
2
3
4
5
5
4
3
2
1
輸入12345,採用尾插法建立單連結串列,當前連結串列裡資料為12345,反轉後資料為54321

完整程式碼單擊此處

相關文章