在不使用循环的情况下获得完整的链表?
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中的每个节点。
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中的每个节点。