跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

LeetCode 1721 交换链表中的节点

讲解 LeetCode 1721 题交换链表中的节点。题目要求将链表中正数第 k 个节点与倒数第 k 个节点的值进行交换并返回头节点。解决方案采用快慢指针法:首先遍历找到正数第 k 个节点,然后利用该节点作为快指针起点,同步移动快慢指针直至快指针到达末尾,此时慢指针指向倒数第 k 个节点。最后直接交换两节点的值,避免修改 next 指针导致断链。时间复杂度 O(n),空间复杂度 O(1)。需注意循环次数及快慢指针初始间隔,防止节点丢失。

魔法巫师发布于 2026/3/27更新于 2026/5/2722 浏览

题目

LeetCode 1721 交换链表中的节点

给你链表的头节点 head 和一个整数 k。

交换 链表正数第 k 个节点和倒数第 k 个节点的值后,返回链表的头节点(链表 从 1 开始索引)。

示例 1:

输入: head = [1,2,3,4,5], k = 2 输出: [1,4,3,2,5]

示例 2:

输入: head = [7,9,6,6,7,8,3,0,9,5], k = 5 输出: [7,9,6,6,8,7,3,0,9,5]

示例 3:

输入: head = [1], k = 1 输出: [1]

提示:

  • 链表中节点的数目是 n
  • 1 <= k <= n <= 10^5
  • 0 <= Node.val <= 100

代码实现

C++

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* swapNodes(ListNode* head, int k) {
        // 1. 找到正数第 k 个节点
        ListNode* first = head;
        for (int i = 0; i < k - 1; ++i) {
            first = first->next;
        }
        
        // 2. 找到倒数第 k 个节点(快慢指针法)
        ListNode* second = head;
        ListNode* fast = first; // 快指针先站在正数第 k 个节点,形成 k 步间隔
        while (fast->next != nullptr) {
            fast = fast->next;
            second = second->next;
        }
        
        // 3. 仅交换两个节点的值
        std::(first->val, second->val);
         head;
    }
};
swap
return

JavaScript

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} k
 * @return {ListNode}
 */
var swapNodes = function(head, k) {
    let first = head;
    for (let i = 1; i < k; ++i) {
        first = first.next;
    }
    
    let second = head;
    let fast = first; // 快指针先站在正数第 k 个节点
    while (fast.next) {
        fast = fast.next;
        second = second.next;
    }
    
    // JS 无内置 swap 函数,需手动实现值交换
    const temp = first.val;
    first.val = second.val;
    second.val = temp;
    
    return head;
};

注意:JavaScript 中无内置 swap 函数,需手动实现值的交换。

解题思路

  1. 定位正数第 k 个节点:从头节点出发,移动 k-1 步,直接找到目标节点。需注意循环次数,因为链表从 1 开始索引。
  2. 定位倒数第 k 个节点:使用'前后指针(快慢指针)'实现。先让快指针走 k 步(即站在正数第 k 个节点),再让快慢指针同步走。当快指针到达末尾时,慢指针即为倒数第 k 个节点。此方法只需一次遍历,避免二次统计长度。
  3. 交换值而非节点:仅交换两个节点的 val,不修改链表的 next 指针。这彻底避免了节点丢失的问题,是最简洁且安全的操作方式。

常见错误与注意事项

易错点错误写法正确写法原因
fast 初始位置fast = headfast = first必须形成 k 步间隔,才能准确定位倒数第 k 个节点
循环次数(找正数第 k 个节点)i <= k 或 i = 0 开始i = 1 开始,i < k(或 i = 0 开始,i < k-1)链表从 1 索引,初始 first=head 是第 1 个节点,只需移动 k-1 步
JS 交换值swap(a, b)临时变量 temp = a; a = b; b = tempJS 无内置 swap 函数,且基本类型是值传递

总结

  1. 核心逻辑:先精准定位两个目标节点,仅交换值而非节点,避免链表结构修改带来的节点丢失问题。
  2. 关键技巧:用间隔 k 的快慢指针一次遍历找到倒数第 k 个节点,时间复杂度 O(n),空间复杂度 O(1)。
  3. 细节注意:循环次数为 k-1 而非 k,快慢指针同步移动的终止条件是 fast->next == nullptr,这些细节保证了定位的准确性。

目录

  1. 题目
  2. 代码实现
  3. C++
  4. JavaScript
  5. 解题思路
  6. 常见错误与注意事项
  7. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • WSDL 详解:WebService 接口描述语言入门
  • Python 纪念币预约自动化工具配置指南
  • 使用 HTML 和 JavaScript 实现文件树
  • 10 篇大模型领域前沿论文汇总
  • 具身导航 VLN 前沿论文汇总 (2023-2026)
  • ionet 框架:Java 方法即 Action 的零学习成本之道
  • CKS 核心命令速查指南
  • Gaussian Grouping:在三维场景中分割与编辑任意物体
  • Node.js 安装与环境变量配置教程
  • Gitee 仓库创建与 Git 协作实战指南
  • Virt-A-Mate 虚拟实境交互软件技术特性解析
  • Windows Python 环境治理(EPGF)系列总览与阅读路线
  • C3P0 反序列化漏洞深度解析:Hex 字节码加载与防御策略
  • 无人机三维路径规划:A*, RRT, APF 算法对比
  • Python 与 C++ 参数传递机制详解
  • vkedit:Vue3 Web 图形编辑器 npm 包,支持标签与二维码设计
  • Java 线程池核心原理与实战配置
  • Python 爬虫实战:批量抓取应用商店分类应用
  • AI 基础学习系列:AIGC 从创意到创造
  • Spark 4.0.2 发布与 GitHub Issues 迁移讨论及社区动态

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online