概述
题目
给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
思路:题目很短,但是通过例子不难发现,k是指旋转的次数,但同时也能发现,如果我们将此时的链表当成一个循环链表,那么原来倒数第K个节点就是我们想要的头节点。但同时还要注意一点,这个K是有可能超过链表长度的,而超出的部分其实是在做无用功,比如链表长度是2,K=5,旋转5次,但是通过发现不难得出,旋转5次和旋转1次的结果相同,即我们对k取余,除数是length(链表长度)。最后我们回归到求倒数第K个节点这个问题上即可,通过快慢指针来找到倒数第k个节点,具体细节看代码。
public class Leetcode61 {
public ListNode rotateRight(ListNode head, int k) {
// 如果链表为空 或者 只有一个节点 说明不用旋转
if(head == null || head.next == null){return head;}
// length表示链表长度
int length = 1;
ListNode temp = head;
while(temp.next!=null){
temp = temp.next;
length++;
}
// 更新K
k = k % length;
// 如果更新完的K等于0,说明不用旋转
if(k == 0){return head;}
// 快慢 指针 找 倒数第k个节点作为头节点
ListNode fast = head;
ListNode slow = head;
while(k!=0){
fast = fast.next;
k--;
}
// 找倒数第K个节点的前一个
while(fast.next!=null){
fast = fast.next;
slow = slow.next;
}
// 保存节点信息并切断
ListNode begin = slow.next;
ListNode result = begin;
slow.next = null;
// 遍历后半段
while(begin.next!=null){
begin = begin.next;
}
// 连接
begin.next = head;
return result;
}
}
为了获取长度,我们遍历了一次链表,即O(n),为了找到快慢指针,快指针 走了 O(n),慢指针为O(n-k),拼接的时候遍历了O(k),所以整个时间复杂度为O(3n),即O(n)。
最后
以上就是无语画笔为你收集整理的Leetcode61. 旋转链表题目的全部内容,希望文章能够帮你解决Leetcode61. 旋转链表题目所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复