0

0

如何正确交换单链表的头节点与尾节点

花韻仙語

花韻仙語

发布时间:2026-02-24 13:25:02

|

890人浏览过

|

来源于php中文网

原创

如何正确交换单链表的头节点与尾节点

本文详解单链表中头尾节点交换的常见逻辑错误:仅更新 head/tail 引用和 next 指针不足以打破原有环路,必须显式修正倒数第二个节点的 next 指向,否则将导致链表成环、display() 无限循环。

本文详解单链表中头尾节点交换的常见逻辑错误:仅更新 head/tail 引用和 next 指针不足以打破原有环路,必须显式修正倒数第二个节点的 next 指向,否则将导致链表成环、display() 无限循环。

在单链表中“交换头尾节点”看似只需调整 head 和 tail 引用及部分 next 指针,但实际需谨慎处理整个链式结构的连通性。原代码试图通过以下四步完成交换:

Node N1 = this.tail;           // 保存原尾节点(新头)
Node Helper = this.head.next;  // 保存原头的后继(新头的下一个)
this.tail = this.head;         // 原头变为新尾
this.tail.next = null;         // 断开新尾的后续链接
this.head = N1;                // 原尾变为新头
this.head.next = Helper;       // 新头指向原头的后继

该逻辑遗漏了关键一环:原链表中倒数第二个节点(即原尾的前驱)的 next 字段仍指向原尾节点(现已成为新头)。这导致链表形成闭环 —— 从新头出发遍历,最终会经由 secondLastNode.next 回到新头,display() 进入死循环。

以示例链表 1 → 2 → 3 → 4(地址简写为 4k→5k→6k→7k)为例:

  • 原 tail 是节点 4(地址 7k),原 head 是节点 1(地址 4k);
  • 原 secondLastNode 是节点 3(地址 6k),其 next 指向 7k(即原 tail);
  • 执行完原代码后,this.head = 7k,this.tail = 4k,4k.next = null,但 6k.next 仍是 7k;
  • 此时链表结构为:7k → 5k → 6k → 7k → 5k → ...,构成 7k ⇄ 5k ⇄ 6k ⇄ 7k 环。

正确解法:必须定位并更新倒数第二个节点的 next 指针

MakeLogo AI
MakeLogo AI

AI驱动的Logo生成器

下载

若链表长度 ≥ 2,需先遍历至倒数第二个节点(记为 prevTail),再执行完整交换:

public void swapHeadAndTail() {
    // 边界检查:空链表或仅一个节点,无需交换
    if (this.head == null || this.head == this.tail) return;

    // 步骤1:找到倒数第二个节点(prevTail)
    Node prevTail = this.head;
    while (prevTail.next != this.tail) {
        prevTail = prevTail.next;
    }

    // 步骤2:暂存关键节点
    Node oldHead = this.head;
    Node oldTail = this.tail;
    Node headNext = oldHead.next;
    Node tailPrev = prevTail; // 即 oldTail 的前驱

    // 步骤3:重连指针
    // 新头是原尾,其 next 应指向原头的后继(跳过原头)
    oldTail.next = headNext;

    // 新尾是原头,其 next 必须为 null
    oldHead.next = null;

    // 倒数第二个节点(原尾前驱)的 next 改为指向原头(新尾)
    tailPrev.next = oldHead;

    // 步骤4:更新 head 和 tail 引用
    this.head = oldTail;
    this.tail = oldHead;
}

⚠️ 注意事项

  • 该操作不适用于长度 ,务必前置校验;
  • 时间复杂度为 O(n),因需遍历至倒数第二个节点;若频繁执行,可考虑维护 prevTail 引用或改用双向链表;
  • display() 无限循环的根本原因是链表出现环,调试时可用快慢指针(Floyd 判圈算法)辅助验证链表完整性;
  • 若链表含重复值,切勿依赖 data 比较节点,始终基于引用(==)判断。

总结:头尾交换不是简单的指针赋值,而是对链表拓扑结构的重构。核心在于——所有受影响的 next 指针都必须被显式修正,尤其容易被忽略的“前驱节点”连接。忽视这一点,轻则 display 卡死,重则引发后续插入/删除逻辑崩溃。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

246

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

866

2024.03.01

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

470

2023.08.14

苹果官网入口与在线访问指南_中国站点快速直达与iPhone查看方法
苹果官网入口与在线访问指南_中国站点快速直达与iPhone查看方法

本专题汇总苹果官网最新可用入口及中国站点访问方式,涵盖官网直达链接、iPhone官方页面查看方法与常见访问说明,帮助用户快速进入苹果官方网站,便捷了解产品信息与官方服务。

4

2026.02.24

Asianfanfics官网入口与访问指南_AFF官方平台最新登录地址
Asianfanfics官网入口与访问指南_AFF官方平台最新登录地址

本专题系统整理Asianfanfics(AFF)官方网站最新可用入口,涵盖官方平台最新直达地址、官网登录方式及中文访问指引,帮助用户快速、安全地进入AFF平台浏览与使用相关内容。

8

2026.02.24

Go分布式服务治理与链路追踪实践
Go分布式服务治理与链路追踪实践

本专题围绕 Go 语言在分布式系统中的服务治理实践展开,系统讲解服务注册与发现、配置中心、限流熔断、灰度发布以及分布式链路追踪方案。通过完整项目示例,帮助开发者构建可观测性完善、稳定性高、易扩展的 Go 微服务架构体系,提升线上系统问题定位与运维效率。

1

2026.02.24

Python自动化测试与持续集成实战
Python自动化测试与持续集成实战

本专题聚焦 Python 在自动化测试与持续集成中的工程化实践,系统讲解测试框架选型、测试用例设计、接口自动化、测试数据管理及测试报告生成。结合 CI/CD 流水线场景,讲解如何将自动化测试融入持续集成流程,实现代码提交即自动测试,提升项目交付质量与团队协作效率。

0

2026.02.24

Java高并发系统设计与性能调优
Java高并发系统设计与性能调优

本专题围绕 Java 在高并发业务场景下的系统设计与性能调优展开,系统讲解线程模型、并发容器、锁机制、异步编程及 JVM 性能调优思路。结合真实高并发业务场景,深入分析接口限流、线程池配置、热点资源优化与系统稳定性保障方案,帮助开发者构建高性能、高可用的 Java 后端系统。

3

2026.02.24

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

1256

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号