LeetCode 精選 TOP 面試題(Java 實現)—— 反轉鏈表 II

一、題目描述

1.1 題目
  • 反轉鏈表 II

  • 反轉從位置 m 到 n 的鏈表。請使用一趟掃描完成反轉。

  • 說明:
    1 ≤ m ≤ n ≤ 鏈表長度。

  • 示例:

輸入: 1->2->3->4->5->NULL, m = 2, n = 4
輸出: 1->4->3->2->5->NULL
1.2 知識點
  • 鏈表
1.3 題目鏈接

二、解題思路

2.1 解題思路
  • 找到需要翻轉鏈表頭結點的前置節點;
  • 利用頭插法將需要翻轉的節點轉移到另一個鏈表上;
  • 最後再將另一個鏈表上的節點恢復到原鏈表即可;

三、實現代碼

3.1 代碼實現
/**
 * 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(head == null || head.next == null) return head;
        ListNode dummyHead1 = new ListNode(0);
        ListNode dummyHead2 = new ListNode(0);

        dummyHead1.next = head;
        ListNode ptr = dummyHead1;
        
        // 尋找前置節點
        int cnt = m;
        while(--cnt > 0) ptr = ptr.next;

        // 拆分鏈表
        int k = n - m + 1;
        while(k-- > 0){
            ListNode node = ptr.next;
            ptr.next = node.next;

            node.next = dummyHead2.next;
            dummyHead2.next = node;
        }

        // 插入節點
        while(dummyHead2.next != null){
            ListNode node = dummyHead2.next;
            dummyHead2.next = node.next;

            node.next = ptr.next;
            ptr.next = node;
            ptr = ptr.next;
        }

        return dummyHead1.next;
    }
}
發佈了369 篇原創文章 · 獲贊 39 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章