61. Rotate List

Medium


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

 

Example 1:

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

Example 2:

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




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

    def get_size(self, head):
        size = 1;
        node = head
        while node:
            if node.next == None:
                node.next = head
                break
            node = node.next
            size+=1
        return size

    def rotateRight(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
        if k == 0:
            return head

        if not head:
            return head
        elif not head.next:
            return head
        size = self.get_size(head)
        target_pos = size - (k % size)-1


        node = head
        for i in range(target_pos):
            node = node.next

        new_head = node.next
        node.next = None

        return new_head

Random Note


From python 3.7 dict guarantees that order will be kept as they inserted, and popitem will use LIFO order but we need FIFO type system. so we need OrderedDict which have popIten(last = T/F) for this req. One thing, next(iter(dict)) will return the first key of the dict