Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 在简化反转单链表的代码片段时,我哪里出错了?_Algorithm_Recursion_Data Structures - Fatal编程技术网

Algorithm 在简化反转单链表的代码片段时,我哪里出错了?

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” 我试图通过仅使

我在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 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
。您可以考虑检查一个空列表。