206. 反轉連結串列及擴充套件
阿新 • • 發佈:2020-07-26
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