- 旋转链表
给你一个链表的头节点 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]
提示:
链表中节点的数目在范围 [0, 500] 内
-100 <= Node.val <= 100
0 <= k <= 2 * 109
分步骤处理即可:
- 避免不必要的旋转:与链表长度成整数倍的「旋转」都是没有意义的(旋转前后链表不变)
- 使用「快慢指针」找到倒数第 k 个节点(新头结点),然后完成基本的链接与断开与断开操作
public ListNode rotateRight(ListNode head, int k) {
//判断不必要的旋转
if(head== null||k==0){
return head;
}
int sum=0;
ListNode tmp=head;
while (tmp!=null){
sum++;
tmp = tmp.next;
}
k%=sum; //真正需要旋转的次数
if(k==0)return head;
//使用「快慢指针」找到倒数第 k 个节点
ListNode slow =head; //slow 最后会停在新头节点的前一位
ListNode fast =head;
while (k-- >0) fast=fast.next;
while (fast.next!=null){
slow=slow.next;
fast=fast.next;
}
ListNode nHead = slow.next; //新头节点
slow.next=null; //断开原来的链接
fast.next=head; // 将新链表的前半部分(原链表的后半部分)与原链表的头结点链接上
return nHead;
}
解法二:「闭合成环」
此文章创于本人学习时的记录,如有错误或更优解还请指出