【问题标题】:Is this the correct way to reverse a linkedList recursively?这是递归反转链接列表的正确方法吗?
【发布时间】:2017-05-22 19:16:51
【问题描述】:

我的反向链表函数似乎有问题,但即使在网上寻找解决方案后,我也无法理解为什么我的方法在三个节点的空运行中失败:( 在其他解决方案中,加星标的部分通常写为“head.next.next = head”。我的 'n.next = head' 行不是在做同样的事情吗?

另外一些解决方案在调用方法之前有一行:

Node secondElem = head.next;
head.next = NULL;

我也不明白为什么需要这样做:(

我想出了这个解决方案,但似乎无法从这里开始:

Node reverseLL(Node head){
if (head == NULL || head.next == NULL) return head;
Node n = reverseLL(head.next);
n.next = head; //**
head.next = NULL 
return n;
}

有人可以向我解释一下吗?

【问题讨论】:

  • 在返回 n 之前需要做 n = n.next。在解决算法问题之前,你应该总是拿纸和笔,在你编码之后,你应该运行你的代码。
  • 或者只返回头部而不是n
  • 正确!但在这种情况下,最后我有一个反向的linkedList 和一个指向linkedList 尾部的头部。所以我的linkedList没有任何trational Head?即我对于 head=>1 => 2 =>3 => Null,我会在反向 3 => 2 => 1 => Null 之后,现在 head 指向节点 1!

标签: data-structures linked-list


【解决方案1】:

当您递归地反转链表时,您需要将前一个头附加到最后。这是列表其余部分的反转结果并没有真正帮助的地方 - 事实上,您最终只想返回它。

但有一点很重要,需要注意:第二个元素将成为反向列表其余部分的最后一个元素。而head.next 在其余部分反转后仍将保留对它的引用。

示例

原始列表

head = 1 -> 2 -> 3 -> NULL

递归调用返回的反向子列表(head 仍为 1,head.next 仍指向 2)

3 -> 2 -> NULL

您可以使用它在递归调用之后将头部附加到末尾,从而反转其余部分:

Node reverseLL(Node head) {
  if (head == NULL || head.next == NULL) return head;
  Node n = reverseLL(head.next);
  head.next.next = head;  
  head.next = NULL;
  return n;
}

【讨论】:

  • 不是'head.next.next = head; ' 和我的 'n.next = head;' 一样吗?如果没有,你能在你的回答中解释一下吗?所以我认为我的解决方案毕竟是正确的?
  • n 赋值给余数反转的结果,与head不同。在示例中,对于顶级调用,n 将指向 3(假设其余部分会神奇地正常工作)。 3 -> next 是 2,所以你会得到 3 -> 1 -> NULL
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-23
  • 2021-05-18
  • 2020-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多