頭插法和尾插法建立連結串列區別

shuaishuai3409發表於2016-02-27

單連結串列反轉是面試時經常會遇到的問題,之前只是在資料結構裡用虛擬碼實現過單連結串列反轉。為落實親手編寫每一個程式的目標,在這裡用java實現反轉。方法有很多,這裡只寫最優的。時間複雜度O(n),空間複雜度O(1)。也就是說不新開闢空間,原地反轉。


這篇部落格主要講述如何採用頭插和尾插兩種方法建立單連結串列。反轉連結串列見下一篇部落格。

不管採用哪種方法,首先應建立表頭,目的是使第一個實際節點和後面的節點是等同的,不會因為刪除、插入等操作區分開考慮。

頭插法:不斷的將新節點插入到表頭後面。

package singleLinklistReverse;

public class Creat {
    //定義節點類
    public class Lnode{
        int data;
        Lnode next;
    }

    public void creatLinklist(String s){

        Lnode first=new Lnode();
        first.next=null;
        for(int i=0;i<s.length();i++){

            Lnode lnode=new Lnode();
            lnode.data=s.charAt(i)-'0';
            lnode.next=first.next;
            first.next=lnode;
        }
        Lnode p=first.next;
        while(p!=null){
            System.out.println(p.data);
            p=p.next;
        }
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner scanner=new Scanner(System.in);
        String s=scanner.nextLine();
        Creat creat=new Creat();
        creat.creatLinklist(s);
            }

}
控制檯輸入:12345
輸出:5
    4
    3
    2
    1

看到輸出結果,大家就會知道頭插法會改變資料輸入順序。在嚴格要求資料順序不變時,可以用尾插法。

尾插法:新來的節點插入到當前節點末尾處。

package singleLinklistReverse_2;

import singleLinklistReverse.Reverse;

public class Creat {
    //定義節點類
    public class Lnode{
        int data;
        Lnode next;
//      public Lnode(int d){
//          this.data=d;
//      }
    }
    //定義連結串列類
    public class linkList{

    }
    /**
     * 採用尾插法來建立單連結串列
     * @param s 接收來自控制檯輸入的字串
     */
    public void creatLinklist(String s){

        Lnode first=new Lnode();
        first.next=null;
        Lnode r=first;
        for(int i=0;i<s.length();i++){

            Lnode lnode=new Lnode();
            lnode.data=s.charAt(i)-'0';
            r.next=lnode;
            r=lnode;
        }
        r.next=null;
        Lnode p=first.next;
            while(p!=null){
                System.out.println(p.data);
                p=p.next;
            }
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner scanner=new Scanner(System.in);
        String s=scanner.nextLine();
        Creat creat=new Creat();
        creat.creatLinklist(s);
    }
}
結果:
12345
1
2
3
4
5

顯然尾插法穩定性更好。

相關文章