【问题标题】:Reverse Linked-List Recursive反向链表递归
【发布时间】:2017-09-19 15:59:28
【问题描述】:
我已经跟踪了我的代码以使用递归来反转链表,但我找不到它有任何问题,但我知道它不起作用。谁能解释一下为什么?
Node reverseLL (Node head) {
if(curr.next == null) {
head = curr;
return head;
}
Node curr = head.next;
prev = head;
head.next = prev;
head = next;
reverseLL(head.next);
}
【问题讨论】:
标签:
java
recursion
linked-list
【解决方案1】:
以下是您的代码的工作版本,添加了一些帮助结构:
class LList {
Node head;
void reverse() {
head = rev(head, head.next);
}
private Node rev(Node node, Node next) {
if(next == null) return node; //return the node as head, if it hasn't got a next pointer.
if(node == this.head) node.next = null; //set the pointer of current head to null.
Node temp = next.next;
next.next = node; //reverse the pointer of node and next.
return rev(next, temp); //reverse pointer of next node and its next.
}
}
class Node {
int val;
Node next;
public Node(int val, Node next) {
this.val = val;
this.next = next;
}
}
【解决方案2】:
切换前需要调用reverseLL(head.next),向下遍历列表,从最后一个节点开始向上。不过,这需要进行更多更改。
【解决方案3】:
有两种可能的实现方式。
第一个带有指向类中head(类属性)的指针
class Solution:
head: Optional[ListNode]
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
node = head
if node == None:
return node
if node.next == None:
self.head = node
return
self.reverseList(node.next)
q = node.next
q.next = node
node.next = None
return self.head
第二种解决方案,不依赖类属性来保存head,一旦你找到它。它通过递归调用堆栈返回指向head的指针
def reverseList(head):
# Empty list is always None
if not head:
return None
# List of length 1 is already reversed
if not head.next:
return head
next = head.next
head.next = None
rest = reverseList(next)
next.next = head
return rest