[英]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所列出即listA
和listB
,但你有人稱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.