0% completed
Solution: Rotate List
On This Page
Problem Statement
Examples
Solution
Step-by-step Algorithm
Code
Complexity Analysis
Problem Statement
Given the head of a linked list and integer k, rotate the list to the right by k places.
Examples
-
Example 1:
- Input: head =
[7, 13, 1],k = 2 - Expected Output:
[13, 1, 7] - Justification: The list
[7, 13, 1]when rotated by 2 positions to the right, the last two elements (13and1) move to the front, resulting in[13, 1, 7].
- Input: head =
-
Example 2:
- Input: head =
[3, 5, 9, 12],k = 1 - Expected Output:
[12, 3, 5, 9] - Justification: Rotating the list
[3, 5, 9, 12]by 1 position to the right, the last element (12) moves to the front of the list, giving us[12, 3, 5, 9].
- Input: head =
-
Example 3:
- Input: head =
[22, 4, 10, 15, 29],k = 7 - Expected Output:
[15, 29, 22, 4, 10] - Justification: Since
kis greater than the length of the list (which is 5), we effectively need to rotate the list byk % length = 2positions to the right. Thus, the last two elements (29and15) move to the front, resulting in[15, 29, 22, 4, 10].
- Input: head =
Solution
To solve this problem, we will first determine the length of the linked list as it is crucial for handling cases where k is greater than the length of the list. By finding the length, we can normalize k to ensure we do not perform unnecessary rotations. The essence of the approach involves connecting the last node of the list to the first node, forming a circular linked list, then breaking this circle at the correct position to form the rotated list. This approach is effective because it allows us to directly access the new head of the list after rotation with minimal computations, ensuring efficiency in terms of both time and space.
To implement this solution, we will follow these steps: calculate the length of the list, normalize k, find the new head of the rotated list, and adjust the next pointers of the nodes to reflect the rotation. This method is chosen for its direct approach to achieving the desired list configuration without needing to individually shift elements or use additional data structures, making it an optimized solution for the problem.
Step-by-step Algorithm
-
Check Base Conditions: If the list is empty (
head == null), consists of a single element (head.next == null), or no rotation is requested (k == 0), simply return the head of the list as it is. -
Calculate List Length and Form a Circular List:
- Initialize a variable
lengthto 1 (since we are starting with at least one node). - Traverse the list with a pointer (say
current) to find the tail node (wherecurrent.next == null) and count the nodes to find the total length of the list. - Once the tail node is found, form a circular list by pointing
current.nextto the head (current.next = head).
- Initialize a variable
-
Normalize the Rotation:
- Since rotating the list by its length brings it back to the original position, normalize
kby taking the remainder ofkdivided by the length (k = k % length). - If
kis 0 after normalization (meaning the rotation count is a multiple of the list's length), break the circular link formed earlier and return the head (list remains unchanged).
- Since rotating the list by its length brings it back to the original position, normalize
-
Find the New Head and Tail:
- Calculate the number of steps to move forward to find the new tail, which is
length - ksteps from the current position (which is initially at the old tail that now points to the old head). - Move
currentforwardlength - ktimes to reach the new tail.
- Calculate the number of steps to move forward to find the new tail, which is
-
Detach the New Head and Tail:
- The new head is one node after the current position (
current.next). - Set the next pointer of the current node (new tail) to
nullto break the circular link. - Return the new head as the head of the rotated list.
- The new head is one node after the current position (
head = [22, 4, 10, 15, 29], k = 7. Link the last node back to the head to form a circle, then normalize k and break the circle at the new tail.
1 of 4
Code
Complexity Analysis
-
Time Complexity: The time complexity of the algorithm is O(n), where n is the number of nodes in the linked list. This is because the algorithm involves a complete traversal to calculate the length of the list, followed by a traversal to the breaking point after normalization of
k. -
Space Complexity: The space complexity of the algorithm is O(1), indicating constant space usage. This is because the rotation is done in-place with a fixed number of variables, and no additional data structures or recursive stack space are used that would scale with the size of the input list.
Reading Progress
0%
On This Page
Problem Statement
Examples
Solution
Step-by-step Algorithm
Code
Complexity Analysis