详解Java递归法实现反转链表(LeetCode 206. 反转链表)
/*
* 示例:
* 输入: 1->2->3->4->5->NULL
* 输出: 5->4->3->2->1->NULL
*
* 链接:https://leetcode-cn.com/problems/reverse-linked-list/
*/
// ListNode的数据结构
class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) {this.val = val;}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
public class Solution {
// 单链表反转
public ListNode reverseList(ListNode head) {
// 递归:
// node1 -> node2 -> node3 -> node4 -> node5 // 先递归到最内层,并return head, return 后 head 位于 node4
// node1 -> node2 -> node3 -> node4 <- node5 // node4.next.next = node4, 即node5.next = node4; node4.next = null
// node1 -> node2 -> node3 <- node4 <- node5 // node3.next.next = node3, 即node4.next = node3; node3.next = null
// node1 -> node2 <- node3 <- node4 <- node5 // node2.next.next = node2, 即node3.next = node2; node2.next = null
// node1 <- node2 <- node3 <- node4 <- node5 // node1.next.next = node1, 即node2.next = node1; node1.next = null
// 此时,node1 成为尾结点, 递归结束
if (head == null || head.next == null) { // 为什么需要这两个判断呢?
return head;
}
ListNode headNode = reverseList(head.next); // 递归到最内层,由内往外,由后往前 计算
head.next.next = head; // 因为这里需要 head.next == null 的判断
head.next = null; // 因为这里需要 head == null 的判断
return headNode;
}
}