当前位置: 首页 > news >正文

【算法--链表】61.旋转链表--通俗讲解

一、题目是啥?一句话说清

给你一个链表,将链表每个节点向右移动 k 个位置,相当于把链表的最后 k 个节点移动到链表的前面。

示例:

  • 输入:head = [1,2,3,4,5], k = 2
  • 输出:[4,5,1,2,3](最后2个节点4和5移动到了前面)

二、解题核心

先计算链表长度,然后找到新链表的头节点和尾节点,重新连接链表。 这就像把一列火车的最后几节车厢连接到火车的前面。

三、关键在哪里?(3个核心点)

想理解并解决这道题,必须抓住以下三个关键点:

1. 处理 k 大于链表长度的情况

  • 是什么:如果 k 大于链表长度,实际有效的旋转次数是 k 对链表长度取模后的值。
  • 为什么重要:因为旋转链表长度倍数次相当于没有旋转,取模可以避免不必要的操作。

2. 找到新链表的头节点和尾节点

  • 是什么:新头节点是原链表的倒数第 k 个节点,新尾节点是原链表的倒数第 k+1 个节点。
  • 为什么重要:只有正确找到这些节点,才能正确断开和重新连接链表。

3. 重新连接链表

  • 是什么:将原链表的尾节点连接到头节点,并将新尾节点的 next 置为 null。
  • 为什么重要:这是形成新链表的关键步骤,如果连接错误会导致链表断开或形成环。

四、看图理解流程(通俗理解版本)

让我们用链表 1 → 2 → 3 → 4 → 5 和 k=2 的例子来可视化过程:

  1. 计算链表长度

    • 链表有 5 个节点,所以长度 n = 5。
    • 计算有效 k = 2 % 5 = 2(因为旋转 5 次相当于不旋转)。
  2. 找到关键节点

    • 新头节点应该是倒数第 2 个节点,即节点 4。
    • 新尾节点应该是倒数第 3 个节点(即第 n - k = 3 个节点),即节点 3。
    • 原尾节点是节点 5。
  3. 重新连接

    • 将新尾节点(节点 3)的 next 置为 null。
    • 将原尾节点(节点 5)的 next 指向原头节点(节点 1)。
    • 新链表变为:4 → 5 → 1 → 2 → 3
  4. 返回结果:返回新头节点 4。

五、C++ 代码实现(附详细注释)

#include <iostream>
using namespace std;// 链表节点定义
struct ListNode {int val;ListNode *next;ListNode() : val(0
http://www.xdnf.cn/news/1460575.html

相关文章:

  • 【Day 44】Shell-Git版本控制器
  • 【Python】数据可视化之分类图
  • Day2p2 夏暮客的Python之路
  • 数学建模25c
  • [数据结构] 链表
  • 深度学习之第七课卷积神经网络 (CNN)调整学习率
  • MySQL子查询的分类讲解与实战
  • 从基础到实践:Web核心概念与Nginx入门全解析
  • 前端url参数拼接和提取
  • 嵌入式基础 -- I²C 信号与位层规则
  • Swift 解法详解:LeetCode 371《两整数之和》
  • 漏洞绕过方式
  • 从零到一:人工智能应用技术完全学习指南与未来展望
  • ClickHouse 分片、 Distributed 表、副本机制
  • flowable基础入门
  • 【c/c++】深度DFS
  • MATLAB平台实现人口预测和GDP预测
  • 美国教授提出的布鲁姆法,结合AI直击学术科研痛点,写作与创新效率直接翻倍!
  • 漫谈《数字图像处理》之实时美颜技术
  • Java并行计算详解
  • 解决 Rollup failed to resolve import “vue3-json-viewer/dist/index.css“ from xxx
  • 【Docker】P1 前言:容器化技术发展之路
  • JS本地存储
  • Java String vs StringBuilder vs StringBuffer:一个性能优化的探险故事
  • C++学习记录(6)string部分操作的模拟实现
  • push pop 和 present dismiss
  • Leetcode 206. 反转链表 迭代/递归
  • 拦截器和过滤器(理论+实操)
  • Websocket链接如何配置nginx转发规则?
  • NV169NV200美光固态闪存NV182NV184