Leetcode61. 旋转链表

题目

给你一个链表的头节点 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)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值