繁体   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