给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
--leetcode
解法一:递归
public ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while(curr !=null){
ListNode temp = curr.next;
curr.next = prev;
prev = curr;
curr = temp;
}
return prev;
}
解法二:递归
太难理解了
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode p = reverseList(head.next);
head.next.next = head;
head.next = null;
return p;
}
}
引用别人的理解
不妨假设链表为1,2,3,4,5。按照递归,当执行reverseList(5)的时候返回了5这个节点,reverseList(4)中的p就是5这个节点,我们看看reverseList(4)实际上这里买呢head.next 就是 p节点,所以head.next.next就是p.next ,为啥不能用p来衔接呢,因为p是个临时变量,还是要使用之前传递下来的。接下来执行完之后,5->next = 4, 4->next = null。这时候返回了p这个节点,也就是链表5->4->null,接下来执行reverseList(3),代码解析为4->next = 3,3->next = null,这个时候p就变成了,5->4->3->null, reverseList(2), reverseList(1)依次类推,p就是:5->4->3->2->1->null