博客
关于我
LeetCode-61-Rotate List
阅读量:466 次
发布时间:2019-03-06

本文共 1642 字,大约阅读时间需要 5 分钟。

链表旋转问题:实现右旋转k位的解决方案

链表作为数据结构之一,在编程中经常遇到各种操作需求。其中,链表旋转操作是比较经典且有趣的题目。本文将详细介绍如何实现链表右旋转k位的功能,并通过示例和代码实现来阐述解决方案。

问题描述

给定一个链表,旋转链表的右k位。这里的k是一个非负整数。需要注意的是,当k大于链表长度时,实际旋转的次数应取模运算后的结果。

示例分析

示例1: 输入链表为1→2→3→4→5→NULL,k=2。

输出链表为4→5→1→2→3→NULL。
解释:第一次右旋转后为5→1→2→3→4→NULL,第二次右旋转后即为4→5→1→2→3→NULL。

示例2: 输入链表为0→1→2→NULL,k=4。

输出链表为2→0→1→NULL。
解释:每次右旋转后链表结构如下:

  • 第一次:2→0→1→NULL
  • 第二次:1→2→0→NULL
  • 第三次:0→1→2→NULL
  • 第四次:2→0→1→NULL

从上述示例可以看出,链表旋转操作具有周期性,旋转k次后结果与旋转k mod n次后结果相同,其中n为链表的长度。

解题思路

解决链表旋转问题可以通过双指针法来实现。具体来说,我们可以使用一个快指针和一个慢指针来遍历链表。快指针从头节点开始,跳过k个节点,而慢指针则从头节点开始,逐步移动。当快指针到达旋转点时,慢指针的位置即为新的头节点。

关键点分析

  • 边界条件处理:

    如果链表为空或k为0,则无需旋转,直接返回原链表。

  • 快指针遍历:

    快指针从头节点出发,跳过k个节点。这里需要注意的是,如果k大于链表长度,应取模运算后再进行计算。

  • 慢指针定位:

    当快指针移动到旋转点时,慢指针的位置即为新的链表头。然后,将链表分为两部分,调整指针的位置以完成旋转。

  • 代码实现

    ListNode* rotateRight(ListNode* head, int k) {
    if (head == nullptr || k == 0) return head;
    // 使用双指针法解决问题
    ListNode* dup = new ListNode(-1);
    dup->next = head;
    ListNode* fast = dup;
    // 计算链表长度
    int count = 0;
    while (fast->next != nullptr) {
    fast = fast->next;
    count++;
    }
    // 计算实际旋转次数
    int n = count - (k % count);
    ListNode* slow = dup;
    while (n > 0) {
    slow = slow->next;
    n--;
    }
    // 调整指针
    fast->next = dup->next;
    dup->next = slow->next;
    slow->next = nullptr;
    return dup->next;
    }

    代码解释

  • 边界条件检查:

    首先检查链表是否为空或k是否为0,如果是,直接返回原链表。

  • 创建辅助节点:

    为了简化操作,我们创建一个辅助节点dup,使得操作更灵活。

  • 计算链表长度:

    使用快指针fast遍历链表,计算链表的总长度count。

  • 计算实际旋转次数:

    由于旋转k次后结果与旋转k mod count次后结果相同,所以计算实际需要旋转的次数n。

  • 定位慢指针:

    使用慢指针slow从dup开始,移动n次,到达旋转点。

  • 调整链表指针:

    将fast指针的下一个节点设置为dup的下一个节点,调整dup和slow的指针,完成旋转。

  • 通过上述步骤,我们就可以实现链表右旋转k位的功能。这种方法不仅时间复杂度为O(n),空间复杂度为O(1),效率很高,而且代码实现简单易懂。

    转载地址:http://zybbz.baihongyu.com/

    你可能感兴趣的文章
    python在心理学研究中的应用有哪些_心理学在线研究可用平台简介和应用进展
    查看>>
    python在使用HTMLTestRunner时,报告为空,错误提示<_io.TextIOWrapper name='<stderr>' mode='w' encoding='utf_8'>...
    查看>>
    python在gpu上运行_【python】python开启GPU加速
    查看>>
    Python在def函数中使用for循环
    查看>>
    Python在def函数中使用for循环
    查看>>
    Python在Conda环境中,但在Windows虚拟环境中没有激活
    查看>>
    python系列【仅供参考】:python pip 错误 ModuleNotFoundError: No module named pip._internal 解决办法
    查看>>
    python图像条状状噪声,使用PYTHON PIL从验证码图像中删除背景嘈杂的线条
    查看>>
    Python图像处理:从内存加载jpeg
    查看>>
    python固定后缀(名物化词汇)词频统计:抽取+统计+可视化
    查看>>
    python商品评论数据采集与分析可视化系统 Flask框架 requests爬虫 NLP情感分析 毕业设计 源码
    查看>>
    python商品数据分析可视化系统(带爬虫)京东销售数据分析 计算机毕业设计 源码下载
    查看>>
    python商品库存管理系统 django框架 商品网站 MySQL数据库 源码下载 计算机毕业设计
    查看>>
    Python哪个版本最稳定好用2023.10.19
    查看>>
    Python和黑客技术的渊源
    查看>>
    Python和RF编写接口自动化
    查看>>
    Python和RF编写web自动化
    查看>>
    python和js哪个难_【Python】记一次学习,Python 与 js 在实现闭包时的差异
    查看>>
    python和java哪个更值得学——来自知乎高赞回答
    查看>>
    python和c混合编程 github_在pycharm中使用git版本管理以及同步github的方法
    查看>>