【Leetcode鏈表】反轉鏈表 II(92)

題目

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

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

示例:it

輸入: 1->2->3->4->5->NULL, m = 2, n = 4
輸出: 1->4->3->2->5->NULL

解答

一輪指針變換,時間複雜度O(n),空間複雜度O(1)io

首先,在鏈表頭部新建兩個空節點thead、p2,令p、p3指向thead,c指向head,全部指針日後移動m個位置,p3始終和p相差n-m個位置(記錄反轉鏈表的第一個節點),開始向後反轉n-m個節點。
反轉完成後,p處於反轉鏈表的最後一個位置,p3反轉鏈表的第一個位置,p2處於反轉鏈表的前一個節點,c處於反轉鏈表的額後一個節點。所以,令p2指向p,p3指向c便可,另外須要注意,若鏈表從頭開始反轉,則return p指針便可。class

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def reverseBetween(self, head: ListNode, m: int, n: int) -> ListNode:
        if not head.next or m==n:
            return head
        n2, m2 = n, m

        thead = ListNode(-1)
        thead.next = head
        p, p3 = thead, thead
        
        p2 = ListNode(-1)
        p2.next = thead
        c = head

        # 指針就位
        while m:
            p2 = p2.next
            p = p.next
            p3 = p3.next
            c = c.next

            m -= 1
        
        # 反轉
        Q = n2-m2
        while Q:
            n = c.next
            c.next = p
            p = c
            c = n

            Q -= 1
        p2.next = p
        p3.next = c

        # 從頭反轉
        if m2==1 and n2!=m2:
            return p
        return thead.next
相關文章
相關標籤/搜索