题目
https://leetcode-cn.com/problems/rotate-list/submissions/
思路
首先,对于链表的题,要明确哪个节点怎么改变他指向的下一个节点
通过观察发现,当旋转次数超过长度时,相当于旋转了次数膜长度次
这是因为当旋转次数是长度的倍数时,相当于没旋转
计算完真正旋转次数后,怎么操作呢
图解
初始状态
目标状态
我们要做的是,先把最后节点的next指向head,再把head改为节点3的下一个节点,最后把节点3的next指向null,返回head
如何实现?
只需要让快指针先走旋转次数步就行了
代码
public ListNode rotateRight(ListNode head, int k) {
if(head==null)
return head;
ListNode tmp = head;
int temp = k;
while(tmp!=null&&0<k)
{
k--;
tmp = tmp.next;
}
int cnt = 0;
if(tmp==null&&k==0)
return head;
if(tmp==null)
k = temp%(temp-k);
else
k = temp; //计算真正旋转次数
if(k==0)
return head;
tmp = head;
ListNode t = head;
while(k>0)
{
tmp = tmp.next;
k--;
}
while(tmp.next!=null)
{
tmp = tmp.next;
t = t.next;
}
tmp.next = head;
head = t.next;
t.next = null;
return head;
}