我是靠谱客的博主 无语画笔,最近开发中收集的这篇文章主要介绍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)。

最后

以上就是无语画笔为你收集整理的Leetcode61. 旋转链表题目的全部内容,希望文章能够帮你解决Leetcode61. 旋转链表题目所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部