單向連結 Single Link

陣列的限制

使用陣列時, 必需先宣告, 如
int []array=new int[10];
a 是一個長度為10個元素的陣列. 一經宣告, 長度就不能改變. 重點在於一開始我們怎麼知道是要宣告為 10, 或 100.

比如要記錄每個客人消費的金額, 打從一開門, 到底是要宣告有幾個客人呢. 因為無法預測, 所以無法定長度.

解決方案

上述的問題, 很明顯的使用陣列是無法解決的, 所以就必需另外想辦法.

如下圖, 即是資料結構課程裏頂頂有名的單向連結圖. 先產生一個 root及 index, 並產生一個節點 @f1.

當需要記錄某數字, 比如50, 就將 50放入 @f1中, 然後再產生一個節點@f2, 此 @f2記錄在@f1的next變數中. 如果當然後記錄某個數字, 就放入最後的節點, 然後再產生一個新的節點 stand by.

如此就可以無限的擴充長度, 只要記憶體不要爆掉就好. 就算記憶體爆了, 還是可以寫個網路連結的方法, 將別台電腦的記憶體納入自已來使用. Terminator 的 Sky Net 不就是採用這種方式嗎.

singlelink

程式代碼

上述的每一個節點, 都有二個值, 一個是記錄數字用的,  另一個是記錄下一個節點. 所以節點的自訂資料格式為

class Node{
    int d;
    Node next;
}

上面的Node next, 是說class裏有一個變數, 而這個變數是指向一個新的Node的意思. 完整代碼如下

public class SingleLink {
    public static void main(String[] args){
        Node root=new Node();
        Node index=root;
        Scanner in=new Scanner(System.in);
        int x=0;
        while(true){
            System.out.print("請輸入數字(-1離開) : ");
            x=in.nextInt();
            if(x==-1)break;
            index.d=x;
            index.next=new Node();
            index=index.next;
        }
        index=root;
        while(index.next!=null){
            System.out.printf("%d ", index.d);
            index=index.next;
        }
        System.out.println();
    }
}
class Node{
    int d;
    Node next;
}

結果 : 
請輸入數字(-1離開) : 10
請輸入數字(-1離開) : 50
請輸入數字(-1離開) : 60
請輸入數字(-1離開) : 70
請輸入數字(-1離開) : 80
請輸入數字(-1離開) : 90
請輸入數字(-1離開) : -1
10 50 60 70 80 90

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *