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