题目描述
给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
样例
示例1:
输入:head = [1,2,3,4,5], k = 2
输出:[4,5,1,2,3]
示例2:
输入:head = [0,1,2], k = 4
输出:[2,0,1]
思路
这个题目其实就是找到一个分割点,把原始链表分成两段。然后把后面一段整个移动到前面一段。
找出分割点节点 x 与 y 。然后 x->next = null,y所在链表段的最后一个节点的next = head。
注意:
这里需要先求以下链表长度 len,然后 k 对 len求余,避免多余的移动。
原始链表为空的情况需要特判一下。
代码:
class Solution {
public ListNode rotateRight(ListNode head, int k) {
int len = 0;
ListNode p = head,x,y;
//List长度
while(p != null) {
len++;
p = p.next;
}
if(len == 0)
return head;
k = k%len;
if(k == 0)
return head;
p = head;
for(int i = 0;i < len-k-1;i++) {
p = p.next;
}
x = p;
y = p;
while(y.next != null) {
y = y.next;
}
p = x.next;
x.next = null;
y.next = head;
return p;
}
}