获取完整的链表而不使用循环?

时间:2017-08-23 13:31:30

标签: linked-list singly-linked-list

LinkedListA = 3-> 4-> 5

LinkedListB = 12-> 6-> 9

我只是想在第一个linkedlistA的末尾添加linkedlistB。   我无法弄清楚为什么 final while while循环能够打印   完整的linkedlistA以及从linkedlistB添加的所有节点!

public static void joinLists(Node headA, Node headB)
{
    Node currentA = headA;
    Node currentB = headB;

    while( currentA.nextLink != null )
    {
        currentA = currentA.nextLink;
    }

    Node newElement = currentB;       
    currentA.nextLink = newElement;      //there is not loop here as you can see to keep updating the list with newElement taking new currentB value    
    currentB = currentB.nextLink;

    currentA = headA;
    while(currentA != null)
    {
        System.out.println(currentA.data);
        currentA = currentA.nextLink;         //output 3->4->5->12->6->9 How!?
    }
}

我最初的逻辑就是这样做: -

public static void joinLists(Node headA, Node headB)
{
    Node currentA = headA;
    Node currentB = headB;

    while (currentB != null)
    {
        currentA = head;
        while( currentA.nextLink != null )
        {
            currentA = currentA.nextLink;
        }

        Node newElement = currentB;       
        currentA.nextLink = newElement;      
        currentB = currentB.nextLink;
    }

    currentA = headA;
    while(currentA != null)
    {
        System.out.println(currentA.data);
        currentA = currentA.nextLink;        
    }

}

但这似乎不起作用!

但在此之前告诉我第一个代码是如何工作的?

3 个答案:

答案 0 :(得分:1)

您将A(5)中的最后一个节点指向B中的第一个节点(12),这与您的输出完全对应。您不需要循环,因为连接是分布式的:每个节点只知道下一个节点的位置。在将B附加到A的末尾时,只有1个链接发生变化:您更改的链接。

答案 1 :(得分:0)

第一个循环将列表headB附加到列表headA的末尾。

public static Node joinLists(Node headA, Node headB)
{
    if (headA == null)
    {
        headA = headB;
    }
    else
    {
        Node currentA = headA;
        while (currentA.nextLink != null)
        {
            currentA = currentA.nextLink;
        }
        currentA.nextLink = headB;
    }

    Node current = headA;
    while (current != null)
    {
        System.out.println(current.data);
        current = current.nextLink;
    }

    return headA;
}

然后打印循环就可以了。

在你的第二个循环中你尝试了一些东西(curretnA = head;)。

如此处所示,较少的变量将使理解更容易。 必须使用连接列表的返回值,因为headA可以为null。

答案 2 :(得分:0)

LinkedList数据结构由ValueByReference Logic的主体工作,也就是说,linkedList的每个节点都可以存储在内存位置的任何位置,我们只是通过将内存地址映射到" Node.next&#34来链接每个节点。 ;字段

在第一个逻辑代码

    Node newElement = currentB;       
    currentA.nextLink = newElement;        
    currentB = currentB.nextLink;

直接映射指向LinkedListA中最后一个元素的headB指针,因此它类似于连接LinkedList中的每个节点。