反轉鏈表 II(Reverse Linked List II)java_leetcode_92

反轉鏈表 II(Reverse Linked List II)java_leetcode_92

版權©: https://blog.csdn.net/zhangjingao/article/details/96965748

題幹

反轉從位置 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

題解

  這個題其實思路我相信經常刷算法的人都是有的,就是分爲三個步驟。

  1. 第一步:找到m的位置,記住m之前的一個鏈表節點,這個作爲前面的部分prehead。
  2. 第二步:new一個新的節點newListNode,指向null,之後從鏈表的第m個節點到第n個節點,每一個節點都指向newListNode,然後newListNode再等於newListNode.next。這樣就保證了最後到n的時候拿到的是反轉後的頭節點,然後將第一步的prehead指向這個newListNode,此時結果就是前面的部分加上反轉後的部分。
  3. 第三步:將鏈表剩餘的部門接在newListNode的最後,作爲最後一部分。

代碼

    public ListNode reverseBetween(ListNode head, int m, int n) {
        if (head == null || head.next == null || n == m) {
            return head;
        }
        ListNode result = head;
        ListNode preHead = null;
        int index = 1;
        ListNode newHead = null;
        //首先判斷是開頭是1還是中間的值開始反轉
        if (m == 1) {
            while (index++ <= n) {
                ListNode temp = head;
                head = head.next;
                temp.next = newHead;
                newHead = temp;
            }
            result = newHead;
        } else {
            //首先遍歷到需要反轉的節點
            while (index < m) {
                index++;
                preHead = head;
                head = head.next;
            }

            //開始翻轉
            while (index++ <= n) {
                ListNode temp = head;
                head = head.next;
                temp.next = newHead;
                newHead = temp;
            }
            //反轉後將翻轉開始前的節點銜接上反轉後的節點頭
            if (preHead != null) {
                preHead.next = newHead;
            }
            newHead = preHead;
        }
        ListNode tempHead = result;
        if (newHead != null) {
            while (tempHead.next != null) {
                tempHead = tempHead.next;
            }
            tempHead.next = head;
        }


        return result;
    }

結果

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章