簡體   English   中英

附加兩個單鏈表

[英]Append two singly linked list

我正在嘗試使用Java實現LinkedList,只是為了測試我的技能。 我遇到了一個問題,我必須附加兩個我創建的鏈表。 我在這里進入一個無限循環。 有什么辦法可以改進代碼並實現所需的輸出嗎?

I / P:

列表A:4-> 3-> 2-> 1-> 0

列表B:4-> 3-> 2-> 1-> 0

O / P應為:4-> 3-> 2-> 1-> 0-> 4-> 3-> 2-> 1-> 0

class List {
    int val;
    List next;

    public List(int val) {
        this.val = val;
    }

    public String toString() {
        String output = "";
        List current = this;

        while (current != null) {
            output += current.val + "->";
            current = current.next;
        }
        return output + "NULL";
    }
}


class AppendLinkedLists {

    static List push(List list, int num) {
        List newList = new List(num);
        newList.next = list;
        return newList;
    }

    static List appendLists(List listA, List listB) {
        if (listA == null)
            return listB;
        else {
            List tempList = listA;
            while (tempList.next.next != null) {
                tempList = tempList.next;
            }
            tempList.next.next = listB;
            return listA;           
        }
    }

    public static void main(String[] args) {
        List listA = new List(0);
        listA = push(listA, 1);
        listA = push(listA, 2);
        listA = push(listA, 3);
        listA = push(listA, 4);

        List listB = listA;

        System.out.println("Input List A : " + listA.toString());
        System.out.println("Input List B : " + listB.toString());
        listA = appendLists(listA, listB);
        System.out.println("Combined Input Lists A and B : " + listA.toString());
    }
}

您沒有2個列表。 你只有一個。

   List listB = listA;

將引用listB指定為指向listA 所以你要將listA附加到自身上。

不管你有什么其他問題,我會糾正這個(是創建一個最簡單的方法listB以類似的方式向你如何創建listA )。

我的另一個評論(希望你不介意)是你已經創建了一個List對象,但它有很少/沒有自己的行為。 我將功能放入List對象而不是創建您的AppendLinkedLists類,而不是:

listA = push(listA, 1);

寫:

listA.push(1);

因此, 行為被封裝在 List 對象中 同樣,你可以寫:

listA.push(listB);

通過使用重載

我看到附加代碼邏輯..

但你的問題是

列表listB = listA;

這不是你所期望的,創建一個新的listB。 並將listA的內容復制到listB。 而是它正在做的是,創建一個新的listB並將listA的引用ID復制到listB。 即只有一個列表,listA。

先糾正這個

你說你有2所列出即listAlistB ,但你有人稱new一次。

List listA = new List(0); 

它將創建一個新列表, listA將指向它。

List listB = listA; 

它將使listB指向同一個列表,到listA指向。

因此,如果您還想創建另一個列表,請以相同的方式創建listA創建listA

你處於一個無限循環中,因為listA與listB是相同的列表 - toString將永遠不會結束,因為你已經創建了一個循環。 實際上(虛構的)字段listA.End.next將指向listA.Start。

您必須重新創建listB或實際復制listA。

我認為你面臨的問題是ListA和ListB實際上是同一個列表,所以如果修改一個,你也可以修改另一個。 因此,當您將ListB附加到ListA時,實際上是將ListA附加到ListA,這會導致無限列表。

問題出在這一行:

List listB = listA;

它做的是它將第二個指針(ListB)分配給ListA指向的同一個列表。

要修復它,您需要制作ListA的實際副本。 鑒於你正試圖測試你的技能,我會留下確切的“如何”作為練習;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM