Algorithm 在简化反转单链表的代码片段时,我哪里出错了?
我在CareerCup上找到了一个解决方案,可以反转单个链接列表:Algorithm 在简化反转单链表的代码片段时,我哪里出错了?,algorithm,recursion,data-structures,Algorithm,Recursion,Data Structures,我在CareerCup上找到了一个解决方案,可以反转单个链接列表: void reverse(node n, node prev) { if (n == null) { head = prev; return; } reverse(n.next, n); n.next = prev; } call reverse (head, null); 这有利于理解和学习。如果原始列表为“1->2->3->4->5”,则反向输出为“5->4->3->2->1” 我试图通过仅使
void reverse(node n, node prev)
{
if (n == null) { head = prev; return; }
reverse(n.next, n);
n.next = prev;
}
call reverse (head, null);
这有利于理解和学习。如果原始列表为“1->2->3->4->5”,则反向输出为“5->4->3->2->1”
我试图通过仅使用一个参数来简化此解决方案,该参数是当前正在处理的节点:
void reverse2(Node n)
{
if(n.next==null){ head = n;return; }
reverse2(n.next);
n=n.next.next;
}
call reverse2(head)
也许你已经知道了,结果是不正确的,方法完成后,修改的仍然是“1->2->3->4->5”
起初我很困惑,想了一会儿,我想我的错是这句话:
n=n.next.next;
在其中,我计划使下一个节点指向当前节点,但是,在我当前的递归中,我自己处理节点“n”,我没有更改当前节点n的任何内容,因此结果列表根本没有更改
我不是100%相信自己,专家能提供一些指导吗?谢谢。您的算法的问题是它不会改变原始数据结构。 最初的算法是这样做的:
n.next = prev;
它实际上反转了一个节点。您只需拨打:
n.next = prev;
它只是更改方法的一个参数,但不做其他任何操作
我怀疑您是否可以使用只接受一个参数的递归方法来解决这个问题,因为在修改当前节点N(I)之后,您需要移动到下一个节点N(I+1),并且下一个节点应该指向N(I)。所以下一次通话应该同时知道N(i)和N(i+1)。首先想到
n=n.next.next代码>为什么要这样更改整个节点
要反转链表,不是只需要更改next
属性吗
应该是这样的
n.next.next=n
考虑当n
指向1->2->3->4->5中的4
时
现在我们有了4.next=5
和5.next=null
在执行时,它会像
4.下一步.下一步
=>5.下一步
=4
1->2->3->4->5---
^------|
一个是明确说明你想要达到的目标。选择一个合适的地方。对于编码,尤其是改进,codereview似乎更适合。算法可以是:如果列表有一个尾部,则将其反转并附加head
。您可以考虑检查一个空列表。