# LeetCode Medium 61. Rotate List
tags: leetcode
問題
アイデア
「単方向連結リストを右向きにk
だけ回転させろ」という問題です.
解法
- 先頭のノードへのポインタを2つ作ります.(1つはノードの数を数え,最後のノードを先頭に繋げる
p
,1つは位置をずらす際に使うp
) - ノードを最後まで探索して,探索したノードの数を数えます.
- こうして,探索し終わったノードを先頭のノードに繋げます.
- そして,
cnt - k - 1
回(k
はcnt
で割ったあまり)q
を次のポインタのノードにします. - こうすることで,
q
を先頭にしたいノードの前のノードにすることができ,q
の次のノードを答えにし,q
の次のポインタをNULL
にすることで,連結リストを循環しないようにすることが出来ます.
計算量
ノードの数を$N$とします.
- 時間計算量
- $O(N)$
- 空間計算量
- $O(1)$
Python
# Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution: def rotateRight(self, head: ListNode, k: int) -> ListNode: if not head: return None p = q = head cnt = 1 while p.next: p = p.next cnt += 1 p.next = head k %= cnt for _ in range(cnt-k-1): q = q.next ans = q.next q.next = None return ans