Given a list, rotate the list to the right by k places, where k is non-negative.
For example:
Given 1->2->3->4->5->NULL
and k = 2
,
return 4->5->1->2->3->NULL
.
The solution is clear. Keep a count of the list and find out how many nodes we need to move at last. If k is equal to 0, then we don't need to move any node. Otherwise, we need to move count - (k % count) nodes.
C++ Code:
/* * func: rotate_right * goal: rotate the list to the right by k places * @param head: head pointer of the list * @param k: input k * return: new head node */ ListNode* rotate_right(ListNode *head, int k){ int count = 0; //Count the number of nodes in the list ListNode *iter = head; ListNode *tail_node = nullptr; while(iter != nullptr){ ++count; tail_node = iter; iter = iter->next; } if(count == 0 || k % count == 0){ return head; } k = k % count; iter = head; //Get the new head int move_count = 1; while(move_count < count - k){ ++move_count; iter = iter->next; } //Set the new head ListNode *new_head = iter->next; iter->next = nullptr; tail_node->next = head; return new_head; }
Python Code:
# func: rotate the list to the right by k places # @param head: head node of the linked list # @param k: given number k # @return: new head of the linked list def rotate_right(head, k): if not head or k <= 0: return head iter = head count = 1 length = 0 while iter: #Get the count of the list and find the number of nodes needed to be moved if not iter.next: iter.next = head length = count count = 0 k = length - k % length elif length != 0 and count == k: break count += 1 iter = iter.next #Set the new head head = iter.next iter.next = None return head
No comments:
Post a Comment