給定一個鏈表,旋轉鏈表,將鏈表每一個節點向右移動 k 個位置,其中 k 是非負數。指針
示例 1:code
輸入: 1->2->3->4->5->NULL, k = 2 輸出: 4->5->1->2->3->NULL 解釋: 向右旋轉 1 步: 5->1->2->3->4->NULL 向右旋轉 2 步: 4->5->1->2->3->NULL
示例 2:it
輸入: 0->1->2->NULL, k = 4 輸出: 2->0->1->NULL 解釋: 向右旋轉 1 步: 2->0->1->NULL 向右旋轉 2 步: 1->2->0->NULL 向右旋轉 3 步: 0->1->2->NULL 向右旋轉 4 步: 2->0->1->NULL
思路:先把鏈表首尾相連,再找到位置斷開循環。io
經過代碼以下:class
# Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: # 時間複雜度O(n),空間複雜度O(1) def rotateRight(self, head: ListNode, k: int) -> ListNode: if not head or not head.next: return head # 標記尾節點 # 統計節點總數,防止k過大循環移動指針而超出時間限制 c, sum = head, 1 while c.next: sum += 1 c = c.next tail = c c.next = head p, c = head, head p2 = p.next # 記錄未來斷開後的首節點 k = k%sum # c先於p指針前k%num個 while k: c = c.next k -= 1 # 在p位置斷開 while c != tail: c = c.next p = p.next p2 = p.next p.next = None return p2