4

我正在尝试使用 Java 实现 LinkedList,只是为了测试我的技能。我遇到了一个问题,我必须附加我创建的两个链表。我在这里陷入了一个无限循环。有什么办法可以改进代码并实现所需的输出?

个人/个人:

列表 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());
    }
}
4

5 回答 5

5

您没有 2 个列表。你只有一个。

   List listB = listA;

将引用分配listB给指向listA。因此,您正在附加listA到自身上。

无论您有什么其他问题,我都会纠正这个问题(最简单的方法是以与listB您的创建方式类似的方式创建listA)。

我的另一条评论(希望您不介意)是您创建了一个 List 对象,但它自己的行为很少/没有。我不会创建您的AppendLinkedLists类,而是将功能放入List对象中,例如:

listA = push(listA, 1);

写:

listA.push(1);

等等。所以行为被封装在 List object中。同样,您可以编写:

listA.push(listB);

通过使用重载

于 2012-09-27T10:07:09.470 回答
2

我看不到附加代码逻辑..

但是你的问题是

列表列表B=列表A;

这不符合您的期望,请创建一个新的 listB。并将listA的内容复制到listB。相反,它正在做的是创建一个新的 listB 并将 listA 的引用 ID 复制到 listB。即只有一个列表,listA。

先纠正这个

于 2012-09-27T10:11:42.917 回答
1

您说您有 2 个列表,即listAlistB,但您只调用new了一次。

List listA = new List(0); 

它将创建一个新列表并listA指向它。

List listB = listA; 

它会listB指向同一个列表,listA指向它。

因此,如果您还想创建另一个列表,请以与创建方式相同的方式创建listA

于 2012-09-27T10:11:53.180 回答
0

您处于无限循环中,因为 listA 与 listB 是同一个列表 - toString 永远不会结束,因为您已经创建了一个循环。事实上(虚构的)字段 listA.End.next 将指向 listA.Start。

您必须重新创建 listB 或实际复制 listA。

于 2012-09-27T10:09:09.677 回答
0

我认为你面临的问题是 ListA 和 ListB 实际上是同一个列表,所以如果你修改一个,你也会修改另一个。因此,当您将 ListB 附加到 ListA 时,实际上是在将 ListA 附加到 ListA,这会导致一个无限列表。

问题出在这一行:

List listB = listA;

所做的是将第二个指针 (ListB) 分配给 ListA 指向的同一个列表。

要修复它,您需要制作 ListA 的实际副本。鉴于您正在尝试测试您的技能,我将留下确切的“如何”作为练习;)

于 2012-09-27T10:09:21.073 回答