Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.
If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.
You may not alter the values in the nodes, only nodes itself may be changed.
Only constant memory is allowed.
Given this linked list:
For k = 2, you should return:
For k = 3, you should return:
(Java Code on Github at the bottom of the post. )
My thoughts and solution:
Q: What is the unknown?
A: To reverse nodes in a linked list k at a time and return the modified list.
Q: What are the data?
A: A linked list and an integer k.
Q: What are the constraints?
A: From the example above, we should probably assume this is a singly linked list. We cannot change the value in the node (Actually this is a very good idea in modifying linked list). Constant memory only. If at some point, the number of nodes is not the multiple of k, these nodes should remain the same order.
Q: Have you seen it before or at least something similar?
A: Yes I think I have. A similar problem is to reverse a singly linked list in place. I solved it before and it only took constant memory. I think we can apply the solution of that problem to each K nodes for reversing purpose.
Q: Good. For the whole problem, what kind of strategy should we use? Suppose we have reversed K nodes in the list, what about the rest of list?
A: We do the same for the rest and connect with the k nodes reversed previously.
Q: Can you describe it in more details?
A: OK, for the rest of the linked list we reverse the nodes in k-Group and connect with previously reversed k nodes. Ah I see where this is heading. We are looking at a recursion here.
Q: Yes we are. Now think about the base case of this recursion.
A: That would be the number of remaining nodes is not a multiple of k and we should just connect them with the previously reversed part.
Q: What about the recursive case?
A: Hmm, we should reverse the current k nodes at hand. reverse the next k nodes and connect with them. Then return the current reversed part so the previously reversed part can connect with it.
Q: OK not super clear but I guess you have the idea. In the base case, how do you determine if the number of remaining nodes is a multiple of k?
A: Starting from where we are, go k steps further. If at any point, we hit null, then we know there are enough nodes for reversal.
Q: Good. The take-away message here is that recursion could be a very handy trick for solving linked list related problems. So keep it in your toolbox.
Code on github: