我从http://www.geeksforgeeks.org/reverse-alternate-k-nodes-in-a-singly-linked-list/
中提出了这个问题和Java解决方案给定链表,编写一个函数来反转每个备用k节点 输入:1-> 2-> 3-> 4-> 5-> 6-> 7-> 8-> 9-> NULL和k = 3 输出:3-> 2-> 1-> 4-> 5-> 6-> 9-> 8-> 7-> NULL。
在他们的java代码中:我真的不明白为什么需要步骤2)。 除了在kAltReverse(Node节点,int k)中的第一个参数之外,其他地方都没有使用它 方法中的此节点参数在每次递归中分配给新的变量current。然后在每次递归中使用current,prev,next变量。
那么为什么需要node.next = step2中的current?
Node kAltReverse(Node node, int k) {
Node current = node;
Node next = null, prev = null;
int count = 0;
/*1) reverse first k nodes of the linked list */
while (current != null && count < k) {
next = current.next;
current.next = prev;
prev = current;
current = next;
count++;
}
/* 2) Now head points to the kth node. So change next
of head to (k+1)th node*/
if (node != null) {
node.next = current; **// why node.next should be moved to current even though node is not impacting on anywhere else in 3), 4)???**
}
/* 3) We do not want to reverse next k nodes. So move the current
pointer to skip next k nodes */
count = 0;
while (count < k - 1 && current != null) {
current = current.next;
count++;
}
/* 4) Recursively call for the list starting from current->next.
And make rest of the list as next of first node */
if (current != null) {
current.next = kAltReverse(current.next, k);
}
/* 5) prev is new head of the input list */
return prev;
}
答案 0 :(得分:1)
你的问题与递归没有任何关系,并且在这种方法中,通过简单地保留第一个prev
并且将大多数代码包含在while循环中,可以避免递归。这个问题都是关于参考的。
该过程重新排列链。就在有问题的代码之前,您有两个未连接的链接列表:
3->2->1->null 4->5->...
\prev \node \current
设置node.next
时,您正在更改节点引用的对象上的属性。因此,您将替换引用以指向不同的对象。当node.next
用作值时,您将获得对象的引用。完成node.next = current
之后你就有了这个:
3->2->1->4->5->...
\prev \ \current
\node