这道题目提供了一个很好的思路,在遇到Linked List的问题时,当看似需要我们移动很多node的时候,我们可以直接移动指向头节点的指针,而不是一个一个地去移动node。另外这道题目还有一个隐藏的陷阱,就是题目中给出的k可能是大于Linked List长度的,所以在解答这道题目的时候还要处理一下这一点。一些例子如下:
[1, 2, 3]; k = 2 -> [2, 3, 1]
可以直接将头节点指向2,将3的next指向1,而将1的next指向null;rotate之后的头节点为原来的第length - k个节点
[1, 2, 3]; k = 5 -> [2, 3, 1]
这个例子的答案与上个例子一样,因为 5 % 3 == 2 % 3 == 2,而且rotate的方法也一样;rotate之后的头节点为原来的第length - (k % length)个节点
所以根据上面的描述我们可以总结出这道题目的解法,使用两个指针,将两个指针分别指向原Linked List的头节点和第length - (k % length) - 1个节点(因为要将这个结点的next设置为null),然后依照上面例子中的方法进行rotate。同时因为这道题目中头节点会发生变化,所以最好使用dummyNode,代码如下:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode rotateRight(ListNode head, int k) {
if(head == null || head.next == null) return head; // corner case
// Set dummyNode
ListNode dummyNode = new ListNode(0);
dummyNode.next = head;
// Set pointers
ListNode fast = dummyNode;
ListNode slow = dummyNode;
// Find the length of list
int l;
for(l = 0; fast.next != null; l++){
fast = fast.next;
}
// Set slow to the l - (k % l)the node
for(int j = l - (k % l); j > 0; j--){
slow = slow.next;
}
// Rotate list
fast.next = dummyNode.next;
dummyNode.next = slow.next;
slow.next = null;
return dummyNode.next;
}
}
知识点:
1. 在Linked List中,如果需要移动的node有很多,那么可以考虑是否可以直接移动头节点的指针
2. dummyNode