1. 题目描述
2. 解题方法
-
思路: 寻找规律,闭合为环。将链表收尾相连后,只需要移动head指针即可以实现右移。
-
步骤如下:
- 遍历链表,统计节点数目n;
- 当k大于n时,出现循环移动。用k = k%n减少冗余的移动;
- 找到规律,从head节点开始移动n-1-k%n步找到移动后的尾节点;
- 最后断开收尾节点。
- 代码:
public ListNode rotateRight(ListNode head, int k) {
if(head==null||head.next==null){
return head;
}
ListNode cur = head;
// 闭合为环
int n = 0;
while(cur.next!=null){
n++;
cur = cur.next;
}
n++;
cur.next = head; // 首尾相连
k = k%n; // 简化移动步数
// 找到旋转后的尾节点
cur = head;
for(int i=0; i<n-k-1; i++){
cur = cur.next;
}
// 断开尾节点
head = cur.next;
cur.next = null;
return head;
}