这是递归反转linkedList的正确方法吗?

时间:2017-05-22 19:16:51

标签: data-structures linked-list

我的反向链接列表功能似乎是错误的,但即使在网上寻找解决方案后,我也无法理解为什么我的方法在三个节点的干运行中失败:( 在其他解决方案中,加星标的部分通常写为“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;
}

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

1 个答案:

答案 0 :(得分: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;
}