我正在尝试使用Java实现LinkedList,只是为了测试我的技能。我遇到了一个问题,我必须附加两个我创建的链表。我在这里进入一个无限循环。有什么办法可以改进代码并实现所需的输出吗?
I / Ps:
列表A:4-> 3-> 2-> 1-> 0
列表B:4-> 3-> 2-> 1-> 0
O / P应为:4-> 3-> 2-> 1-> 0-> 4-> 3-> 2-> 1-> 0class 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());
}
}
答案 0 :(得分:5)
您没有2个列表。你只有一个。
List listB = listA;
指定引用listB
指向listA
。所以你要将listA
附加到自己身上。
无论您遇到什么其他问题,我都会更正(最简单的方法是以与您创建listB
的方式类似的方式创建listA
)。
我的另一条评论(希望你不介意)是你已经创建了一个List对象,但它自己的行为很少/没有。我会将功能放入AppendLinkedLists
对象,而不是创建List
类。而不是:
listA = push(listA, 1);
写:
listA.push(1);
等。因此行为被封装在 List
对象中。同样,你可以写:
listA.push(listB);
使用重载。
答案 1 :(得分:2)
我看到附加代码逻辑..
但你的问题是
列表listB = listA;
这不是你所期望的,创建一个新的listB。并将listA的内容复制到listB。而是它正在做的是,创建一个新的listB并将listA的引用ID复制到listB。即,只有一个列表,listA。
先纠正这个
答案 2 :(得分:1)
你说你有2个列表,即listA
和listB
,但你只调用了new
一次。
List listA = new List(0);
它会创建一个新列表,listA
将指向它。
List listB = listA;
它会使listB
指向listA
所指向的相同列表。
因此,如果您还想创建另一个列表,请以相同的方式创建您创建的listA
答案 3 :(得分:0)
你处于一个无限循环中,因为listA与listB是相同的列表 - toString将永远不会结束,因为你已经创建了一个循环。实际上(虚构的)字段listA.End.next将指向listA.Start。
您必须重新创建listB或实际复制listA。
答案 4 :(得分:0)
我认为你面临的问题是ListA和ListB实际上是同一个列表,所以如果修改一个,你也可以修改另一个。因此,当您将ListB附加到ListA时,实际上是将ListA附加到ListA,这会导致无限列表。
问题出在这一行:
List listB = listA;
它的作用是将第二个指针(ListB)分配给ListA指向的同一个列表。
要修复它,您需要制作ListA的实际副本。鉴于你正试图测试你的技能,我将留下确切的“如何”作为练习;)