版权声明:转载请注明出处,请勿商用谢谢! https://blog.csdn.net/qq_34064803/article/details/89737416
题目
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
示例 1:
输入:1->2->3->4->5->NULL
,k = 2
输出:4->5->1->2->3->NULL
解释:
向右旋转 1 步:5->1->2->3->4->NULL
向右旋转 2 步:4->5->1->2->3->NULL
示例 2:
输入:0->1->2->NULL
,k = 4
输出:2->0->1->NULL
解释:
向右旋转 1 步:2->0->1->NULL
向右旋转 2 步:1->2->0->NULL
向右旋转 3 步:0->1->2->NULL
向右旋转 4 步:2->0->1->NULL
算法
public class P61_RotateList {
public ListNode rotateRight(ListNode head, int k) {
ListNode p = head;
ListNode q = head;
ListNode r = null;
int length = 0;
if(head==null){
return head;
}
//求链表长度
while(p!=null){
length++;
p=p.next;
}
if(k%length==0){
return head;
}
int index = length - k%length+1;
for(int i = 0;i<index-2;i++){
q = q.next;
}
r = q.next;
q.next = null;
ListNode rt = r;
while(rt.next!=null){
rt = rt.next;
}
rt.next = head;
return r;
}
}
思路:
head
为空直接返回- 求链表长度
length
- 如果
k>length
,每一栋length
长度链表回到原点,所以要做一次k%length
- 从断点处重新拼接链表