@(labuladong的算法小抄)[链表]
leetcode 92. 反转链表 II
题目描述
解题思路
参考:labuladong的算法小抄P283
纯递归解法
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
/* 以head为起点,翻转[m,n]区间内的节点,返回新链表的头结点 */
public ListNode reverseBetween(ListNode head, int m, int n) {
/* base case */
if (m == 1) {
return reverseN(head, n);
}
/* 对于head.next来说,就是翻转区间[m-1, n-1] */
/* 前进到翻转的起点就是base case */
head.next = reverseBetween(head.next, m - 1, n - 1);
return head;
}
/* 后驱节点 */
ListNode successor = null;
/* 翻转以head为起点的n个节点,返回新链表的头结点 */
private ListNode reverseN(ListNode head, int n) {
if (n == 1) {
/* 记录第n+1个节点,后面要用 */
successor = head.next;
return head;
}
/* 以head.next为起点,翻转n-1个节点 */
ListNode last = reverseN(head.next, n - 1);
head.next.next = head;
/* 让翻转之后的head节点和后面的链表连起来 */
head.next = successor;
return last;
}
}