leetcode刷題筆記-92. 反轉連結串列II(java實現)
阿新 • • 發佈:2021-01-09
題目描述
反轉從位置 m 到 n 的連結串列。請使用一趟掃描完成反轉。
說明:
1 ≤m≤n≤ 連結串列長度。
示例:
輸入: 1->2->3->4->5->NULL, m = 2, n = 4
輸出: 1->4->3->2->5->NULL
來源:力扣(LeetCode)連結:https://leetcode-cn.com/problems/reverse-linked-list-ii
解題思路
從遞迴反轉整個連結串列開始,然後反轉連結串列前n個元素,最後反轉m到n之間的元素,它們的思路是逐級進行轉化的。
反轉整個連結串列遞迴結束條件是head.next==null;反轉前n個結束條件是n遞減減少到1時結束;反轉m到n之間的元素需要進行兩層的遞迴,即m和n同時遞減到要開始反轉的位置,然後從該位置進行反轉前n-m+1個元素。
解題程式碼
複雜度分析
時間複雜度O(n),其中 n 為二叉樹節點的個數。每個節點在遞迴中只被遍歷一次。
空間複雜度O(n),其中 n 為二叉樹節點的個數。每個節點在遞迴中只被遍歷一次。
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode reverseBetween(ListNode head, int m, int n) { if(m == 1) { return reverseN(head, n); } head.next = reverseBetween(head.next, m-1, n-1); return head; } public ListNode node; public ListNode reverseN(ListNode head, int n) { if(n == 1) { node = head.next; return head; } ListNode lastNode = reverseN(head.next, n-1); head.next.next = head; head.next = node; return lastNode; } }