61 Rotate List

Given the head of a linked list, rotate the list to the right by k places.

Example 1:

          1 -> 2 -> 3 -> 4 -> 5
rotate 1: 5 -> 1 -> 2 -> 3 -> 4
rotate 2: 4 -> 5 -> 1 -> 2 -> 3

Input: head = [1,2,3,4,5], k = 2
Output: [4,5,1,2,3]

Example 2:

          0 -> 1 -> 2
rotate 1: 2 -> 0 -> 1
rotate 2: 1 -> 2 -> 0
rotate 3: 0 -> 1 -> 2
rotate 4: 2 -> 0 -> 1

Input: head = [0,1,2], k = 4
Output: [2,0,1]

Constraints:

  • The number of nodes in the list is in the range [0, 500].
  • -100 <= Node.val <= 100
  • 0 <= k <= 2 * 109
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 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: Optional[ListNode],
        k: int
    ) -> Optional[ListNode]:
        if not head:
            return None
        
        length = 1
        tail = head
        while tail.next:
            tail = tail.next
            length += 1
        k = k % length
        
        tail.next = head
        if k > 0:
            for i in range(length - k):
                tail = tail.next

        new_head = tail.next
        tail.next = None
        return new_head
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func rotateRight(head *ListNode, k int) *ListNode {
    if head == nil {
        return head
    }
    
    tail := head
    count := 1
    for tail.Next != nil {
        tail = tail.Next
        count++
    }
    
    tail.Next = head
    k %= count
    if k != 0 {
        for i := 0; i < count-k; i++ {
            tail = tail.Next
        }
    }
    
    newHead := tail.Next
    tail.Next = nil
    return newHead
}