简体   繁体   中英

Append two singly linked list

I am trying to implement LinkedList using Java, just to test my skills. I am stuck at one problem, where I have to append two linked lists that I have created. I get into an infinite loop here. Is there any way I can improve the code and implement the desired output ?

I/Ps :

List A : 4->3->2->1->0

List B : 4->3->2->1->0

O/P should be : 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());
    }
}

You don't have 2 lists. You only have one.

   List listB = listA;

assigns the reference listB to point to listA . So you're appending listA onto itself.

Regardless of what other issues you have, I would correct this (the simplest way being to create a listB in a similar fashion to how you've created listA ).

My other comment (hope you don't mind) is that you've created a List object, but it has little/no behaviour of its own. Instead of creating your AppendLinkedLists class, I would put the functionality into the List object eg instead of:

listA = push(listA, 1);

write:

listA.push(1);

etc. So the behaviour is encapsulated within the List object . Similarly you could then write:

listA.push(listB);

by making use of overloading .

I dint see the append code logic..

But your problem is

List listB=listA;

this is not doing what you are expecting it to , create a new listB. and copy contents of listA to listB. Rather what it is doing is, create a new listB and copy the reference ID of listA to listB. ie there is only one list , listA.

correct this first

You said you have 2 lists namely listA and listB , But you have called new only once.

List listA = new List(0); 

it will create a new list and listA will point to it.

List listB = listA; 

it will make listB point to same list, to which listA is pointing.

So, if you want to create another list also, create in same way how you created listA

You're in an inifinite loop, because listA is the same list as listB - toString will never end, because you've made a cycle. In fact (imaginary) field listA.End.next would point to listA.Start.

You have to either recreate listB or actually copy listA.

I think the problem you are facing is that ListA and ListB are actually one and the same list, so if you modify one, you modify the other as well. So when you append ListB to ListA, you are actually appending ListA to ListA, which leads to an infinite list.

The problem is in this line:

List listB = listA;

What did does is that it assigns a second pointer (ListB) to the same list that ListA is pointing to.

To fix it you will need to make an actual copy of ListA. Given you are trying to test your skills I will leave the exact "how" as an exercise ;)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM