1. 程式人生 > >java 手動實現單鏈表(尾插法和頭插法)

java 手動實現單鏈表(尾插法和頭插法)

頭插法: 頭插法的實現相對簡單 思路是將新形成的節點的下一個賦值為header

               再把新形成的節點地址傳給header即將header向前移動

import java.util.Random;
import java.util.Scanner;

public class Link {
    //建立一個儲存資料的屬性
    int data;
    //建立儲存下一個節點地址的屬性
    Link next;
    static int length=0;
    /**
     * 建立一個連結串列
     * @param len  產生資料的長度
     * @return  連結串列第一個節點地址
     */
    public static Link creat(int len){
        //定義隨機物件
        Random r=new Random();
        //定義連結串列的節點
        Link newnode,header;
        //header永遠儲存第一個節點的地址,tailer永遠儲存最後一個節點的地址
        header=null;
        for (int i = 0; i < len; i++) {
            //生成一個隨機數字
            int temp=r.nextInt(100);
            //建立一個臨時節點
            newnode=new Link();
            //長度
            length++;
            //為屬性賦值
            newnode.data=temp;
            //判斷當前連結串列是否第一次賦值
            if(header==null){
                header=newnode;
            }else{
                //將新節點連線到連結串列的頭部
                newnode.next=header;
                //header永遠儲存第一個節點的地址
                header=newnode;
            }
        }
        return header;
    }
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.println("輸入長度:");
        int l=sc.nextInt();
        System.out.println("列印陣列:");
        //呼叫陣列生成方法 傳入鍵盤值l
        Link head=Link.creat(l);
        for (int i = 0; i < Link.length; i++) {
            System.out.print(head.data+" ");
            //把當前物件的下一個物件地址傳給當前物件
            head=head.next;
        }
    }
}

尾插法: 尾插法相對於頭插法有些許不同 因為要返回頭 頭不能動 所以需要一個tailer來記錄最後一個值 tailer右移   

import java.util.Random;
import java.util.Scanner;

public class Link {
    //建立一個儲存資料的屬性
    int data;
    //建立儲存下一個節點地址的屬性
    Link next;
    static int length=0;
    /**
     * 建立一個連結串列
     * @param len  產生資料的長度
     * @return  連結串列第一個節點地址
     */
    public static Link creat(int len){
        //定義隨機物件
        Random r=new Random();
        //定義連結串列的節點
        Link newnode,header,tailer;
        //header永遠儲存第一個節點的地址,tailer永遠儲存最後一個節點的地址
        header=tailer=null;
        for (int i = 0; i < len; i++) {
            //生成一個隨機數字
            int temp=r.nextInt(100);
            //建立一個臨時節點
            newnode=new Link();
            //長度
            length++;
            //為屬性賦值
            newnode.data=temp;
            //判斷當前連結串列是否第一次賦值
            if(header==null){
                header=tailer=newnode;
            }else{
                //將新節點連線到連結串列的尾部
                tailer.next=newnode;
                //tailer永遠儲存最後一個節點的地址
                tailer=newnode;
            }
        }
        return header;
    }
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.println("輸入長度:");
        int l=sc.nextInt();
        System.out.println("列印陣列:");
        //呼叫陣列生成方法 傳入鍵盤值l
        Link head=Link.creat(l);
        for (int i = 0; i < Link.length; i++) {
            System.out.print(head.data+" ");
            //把當前物件的下一個物件地址傳給當前物件
            head=head.next;
        }
    }
}

這裡可以比較一下兩種方法的不同:

頭插法: if(header==null){                                                   尾插法: if(header==null){
                   header=newnode;                                                             header=tailer=newnode;
                }else{                                                                                     }else{
                //將新節點連線到連結串列的頭部                                                 //將新節點連線到連結串列的尾部
                newnode.next=header;                                                       tailer.next=newnode;
                //header永遠儲存第一個節點的地址                                     //tailer永遠儲存最後一個節點的地址
                header=newnode;                                                               tailer=newnode;
                }                                                                                             }