在不使用循环的情况下获得完整的链表?

getting full linked list without usage of loop?

LinkedListA = 3->4->5

LinkedListB = 12->6->9

我只是想在第一个 linkedlistA 的末尾添加 linkedlistB。 我无法弄清楚为什么 final 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;        
    }

}

但这似乎行不通!

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

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

第一个循环将列表 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;)。

变量越少,理解起来就越容易,如此处所示。 必须对连接列表使用 return 值,因为 headA 可能为空。

LinkedList 数据结构的工作原理是 ValueByReference 逻辑,这意味着 linkedList 的每个节点都可以存储在内存位置的任何位置,我们只是通过将内存地址映射到 "Node.next" 字段来链接每个节点

在第一个逻辑代码

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

你直接将headB指针映射到LinkedListA中的最后一个元素,所以它类似于连接LinkedList中的每个节点。