1. 程式人生 > 實用技巧 >206. 反轉連結串列及擴充套件

206. 反轉連結串列及擴充套件

206. 反轉連結串列

反轉一個單鏈表。

示例:

輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL

遞迴

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

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        
if not head or not head.next:return head ans=self.reverseList(head.next) head.next.next=head head.next=None return ans

92. 反轉連結串列 II

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

簡單來說就是取出m~n的這一小段連結串列,反轉後再插回去

以本題為例:

反轉的是 2,3,4 這三個點,那麼我們可以先取出 2,用 cur 指標指向 2,然後當取出 3 的時候,我們將 3 指向 2 的,把 cur 指標前移到 3,依次類推,到 4 後停止,這樣我們得到一個新連結串列 4->3->2, cur 指標指向 4。

對於原連結串列來說,有兩個點的位置很重要,需要用指標記錄下來,分別是 1 和 5,把新連結串列插入的時候需要這兩個點的位置。用 pre 指標記錄 1 的位置當 4 結點被取走後,5 的位置需要記下來。這樣我們就可以把反轉後的那一小段連結串列加入到原連結串列中。

class Solution:
    def reverseBetween(self, head: ListNode, m: int, n: int) -> ListNode:
        if not head.next or n == 1:
            return head
        dummy = ListNode()
        dummy.next = head
        pre = None
        cur = head
        i = 0
        p1 = p2 = p3 = p4 = None
        while cur:
            i += 1
            next = cur.next
            if m < i <= n:
                cur.next = pre
            if i == m - 1:
                p1 = cur
            if i == m:
                p2 = cur
            if i == n:
                p3 = cur
            if i == n + 1:
                p4 = cur
            pre = cur
            cur = next
        if not p1:
            dummy.next = p3
        else:
            p1.next = p3
        p2.next = p4
        return dummy.next