Java之鏈表操作源碼及部分思路

注意Java中沒有指針,所以先定義一個節點node的類,包括一個整形數據data和一個包含自身的類似指針next

在新建對象的過程中一定要先聲明,這點和C++不同,而且Java有自動回收的功能,也就是說new的對象不用自己刪除

我在寫函數的過程中因爲引用無法使用,把對應的功能函數都寫在了定義的鏈表類裏面了,而且Java無法在類外聲明對應的函數,就像用class名::函數名的這種,所以代碼看起來很難受,請見諒。

這個鏈表基本的功能已經實現了,但是查找部分有缺陷,只能查找第一個相同的數,當還有相同的數存在則無法顯示,刪除也是這樣的問題,解決思路是將while語句中的判斷改爲p.next != null,然後在循環內部加一個if語句來判斷,並將結果存在一個數組裏,但我不清楚Java在調用數組時返回該如何返回,而且也不能判斷具體有多少個相同的數,所以這點一直改不了

其他的暫時沒測試出什麼問題,如果不出意外,鏈表這章就算是結束了

 

public static class node{

        int data;
        node next;
    }
    
    public static class link{
            node head;
            int length;
        void link( node head,int length) {
                    this.head = head;
                    this.length = length;
                    head.next = null;
            }    
        void input(int temp[]) {        //輸入轉換部分
                    int x=0;        
                //輸入一串帶空格的數據並轉爲整數存入數組中
                    String s;
                    System.out.println("請輸入您將存放的數據:");
                    System.out.println();
                    Scanner inchar = new Scanner(System.in);    
                    s = inchar.nextLine();
                    String[] arr;
                    arr = s.split(" ");
                //將n個數據輸入數組中    
                    while(length != x)//遍歷所有的字符串並轉換成整數
                {        
                        if( x<arr.length) {
                            temp[x]=Integer.parseInt(arr[x]);
                        }
                        else temp[x]=0;
                        x++;            
                }
            }
        void creatlink(link L) {        //尾插法新建
                    node p = new node();
                    p = L.head;
                    int temp[] = new int[length];
                    input(temp);
                    System.out.println("您正在用尾插法新建鏈表");
                    //尾插法新建鏈表
                    for(int i=0;i<length;i++) {
                        node q = new node();
                        q.data = temp[i];
                        p.next = q;
                        p = q;
                        }
                    p.next = null;    

 

            }        
    
        void creatlink2(link L) {        //頭插法新建
                    node p = new node();
                    p = L.head;
                    int temp[] = new int[length];
                    input(temp);
                    System.out.println("您正在用頭插法新建鏈表");
                    System.out.println("注意該方法新建的鏈表存儲數據爲倒序存放");
                    //尾插法新建鏈表
                    for(int i=0;i<length;i++) {
                        node q = new node();
                        q.data = temp[i];
                        q.next = p.next;
                        p.next = q;
                    }

            }
        
        void show(link L) {        //顯示鏈表
                    node p = new node();
                    p = L.head;
                    int i = 1;
                    while(p.next != null) {
                        System.out.println("第"+i+"個元素是:"+p.next.data);
                        p = p.next;
                        i++;
                    }            
            }
        
        void insert(link L) {        //尾部插入元素
                    node p = new node();
                    p = L.head;
                    System.out.println("你將插入一個數:");
                    System.out.println();
                    int n = 0;
                    Scanner insert = new Scanner(System.in);
                    n = insert.nextInt();
                    while(p.next != null)
                        p = p.next;
                    node q = new node();
                    q.data = n;
                    p.next = q;
                    q.next = null;
                    length++;
            }
        void insertfor(link L,int a) {
                    node p = new node();
                    p = L.head;
                    System.out.println("你將插入一個數:");
                    System.out.println();
                    int n = 0;
                    Scanner insert = new Scanner(System.in);
                    n = insert.nextInt();
                    int s = 1;
                    while(s++ != a && a>0) {
                        p = p.next;
                    }
                    node q = new node();
                    q.data = n;
                    q.next = p.next;
                    p.next = q;        
                    length++;
            }
        int find(link L,int n) {    //只能查找一個數
                    node p = new node();
                    p = L.head;
                    int m = 1;
                    while(p.next != null && p.next.data != n) {                
                            p = p.next;
                            m++;
                    }
                    if (m<=length) return m;
                    else return -1;            
            }
        int delete(link L) {
                    node p = new node();
                    p = L.head;
                    System.out.println("請輸入您要刪除的數據:");
                    System.out.println();
                    int n = 0;
                    Scanner insert = new Scanner(System.in);
                    n = insert.nextInt();
                    int m = 1;
                    int x = find(L,n);
                    if(x != -1) {
                        while(m!=x) {
                            p=p.next;
                            m++;
                        }
                        p.next=p.next.next;
                        return 1;
                    }
                    else {
                        System.out.println("無此數據,刪除失敗");
                        return -1;
                    }
            }
        
    }

    static int work() {
        System.out.println("**************************");
        System.out.println("*******請選擇如下操作*******");
        System.out.println("  1.頭插新建       2.尾插新建   ");
        System.out.println("  3.尾部插入       4.刪除數據   ");
        System.out.println("  5.查找數據       6.顯示數據   ");
        System.out.println("  7.指定插入       8.退出操作   ");
        System.out.println("**************************");
        System.out.println();
        System.out.println("*******請輸入您的選擇*******");
        int chose = 0;
        Scanner num= new Scanner(System.in);
        chose = num.nextInt();
        String choose[]= {"","頭插新建","尾插新建","尾部插入","刪除數據",
                "查找數據","顯示數據","指定插入","退出操作"};
        if (chose>0 && chose<=8) {
            System.out.println("您選擇的操作是:  "+choose[chose]);
            System.out.println();
        }
        else {
            
            System.out.println("您的選擇有誤,請重新輸入:");
            System.out.println();
            work();
        }
        return chose;
    }

    
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //函數的聲明與使用:
        //注意這下面要先實例化對象,這和C++不同,要先new才證明存在這個對象
        //否則函數無法聲明與調用
            node head = new node();
            link mylink = new link();
            int a=work();    
            while(a != 8) {
            switch(a) {
                case 1:{
                        System.out.println("你將新建一個鏈表,長度爲:");
                        System.out.println();
                        Scanner maxnum = new Scanner(System.in);
                        int max = maxnum.nextInt();
                        mylink.link(head,max);        //初始化
                        mylink.creatlink2(mylink);
                        System.out.println("您已經成功新建一個長度爲"+mylink.length+"的鏈表");
                        System.out.println("請選擇繼續操作");
                        a=work();                        
                        }
                    break;
                case 2:{
                        System.out.println("你將新建一個鏈表,長度爲:");
                        System.out.println();
                        Scanner maxnum = new Scanner(System.in);
                        int max = maxnum.nextInt();
                        mylink.link(head,max);        //初始化
                        mylink.creatlink(mylink);
                        System.out.println("您已經成功新建一個長度爲"+mylink.length+"的鏈表");
                        System.out.println("請選擇繼續操作");
                        a=work();                            
                        }
                    break;
                case 3:{
                        mylink.insert(mylink);
                        System.out.println("請選擇繼續操作");
                        a=work();                            
                        }
                    break;
                case 4:{
                        int b = mylink.delete(mylink);
                        if(b != -1) {
                            System.out.println("請選擇繼續操作");
                            a=work();                            
                            }
                        else {
                            System.out.println("請選擇繼續操作");
                            a=work();    
                        }
                    
                        }
                    break;
                case 5:{                    
                            System.out.println("請輸入您要查找的數據:");
                            System.out.println();
                            int n = 0;
                            Scanner insert = new Scanner(System.in);
                            n = insert.nextInt();
                            int x = mylink.find(mylink, n);
                            if(x != -1) {
                                System.out.println("您要查找的數據:"+n+"在"+x+"處");
                                System.out.println("請選擇繼續操作");
                                a=work();                            
                                }
                            else {
                                System.out.println("您要查找的數據:"+n+"並不存在");
                                System.out.println("請選擇繼續操作");
                                a=work();    
                            }
                    
                        }
                    break;
                case 6:{
                        mylink.show(mylink);
                        System.out.println("請選擇繼續操作");
                        a=work();                        
                        }
                    break;
                case 7:{
                        System.out.println("目前鏈表的長度爲"+mylink.length);
                        System.out.println("請輸入您要插入的位置:");
                        System.out.println();
                        Scanner maxnum = new Scanner(System.in);
                        int max = maxnum.nextInt();
                        mylink.insertfor(mylink, max);
                        System.out.println("請選擇繼續操作");
                        a=work();    
                        }
                    break;
                case 8:
                    break;
                }
            }
        

        }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章