Example
Given 1->2->3->4->5->NULL and k = 2
return 4->5->1->2->3->NULL
思路
如果k == 0, k == len的话,是不需要反转的。这里的k是一个circular的概念,如果超过了LinkedList的长度,就用k % len。为了让代码更好写,一开始直接定义好n == k % len,这样不管k是不是大于LinkedList的长度都这么算。
重新连接链表的题目,肯定要找到这个要操作的node的之前的那个node。因为这个prenode之后会变成tail,所以要把rotateNode,也就是newHead保存一下,不能在这里就让preNode.next = null。这样就改变了原先的链表,后面的node的找不到了,之后的操作都会发生nullpointerExxceptions。
再找到整个链表的最后一个Node,为了让这个lastNode和原本的head接起来。
接好之后不要忘记把preNode.next = null,否则整个链表是个环
如果用slow, fast那种方法,找pre和last只要遍历一遍就可以了。
解法
public ListNode rotateRight(ListNode head, int k) {
//corner case
if(head == null || head.next == null) return head;
int len = getLen(head);
//if k == len, the list wont' reverse
int n = k % len;
if(n == 0) return head;
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode pre = dummy;
ListNode last = dummy;
//find the node pre the rotate node
for(int i = 0; i < len - n; i++){
pre = pre.next;
}
ListNode rotateNode = pre.next;
//find the last node
for(int i = 0; i < len; i++){
last = last.next;
}
last.next = head;
pre.next = null;
return rotateNode;
}