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

解决反转链表后只打印一个节点的问题

在链表操作中,反转链表是一项常见的任务。然而,在实现过程中,开发人员可能会遇到一些意想不到的问题,比如反转链表只打印一个节点。这通常是由于对链表结构的不完全理解造成的。

class Solution { //Function to check whether the list is palindrome. boolean isPalindrome(Node head) { Node temp = head; Node reversed = reverseList(temp); Node cur = head; while (cur != null) { System.out.println(cur.data + " inloop"); cur = cur.next; } return true; } Node reverseList(Node node) { Node prev = null; Node current = node; Node next = null; while (current != null) { next = current.next; current.next = prev; prev = current; current = next; } node = prev; return node; } }

上述代码试图判断链表是否为回文链表。它首先逆转链表,然后通过原始链表打印每个节点的值。然而,操作结果只打印了第一个节点。

问题在于,reverseList 该方法直接修改了原链表的结构。反转后,原链表的头节点变成尾节点,尾节点 next 指针指向 null。因此,当使用时 cur = head 当原始链表遍历时,循环只执行一次,因为 head.next 已经变成了 null。

提供三种解决方案:

1. 创建新的反转链表

最直接的解决方案是 reverseList 该方法创建了一个新的链表,而不是修改原始链表。通过这种方式,调用器可以同时拥有原始链表和反转链表,以便进行比较操作。

Node reverseList(Node node) { Node prev = null; Node current = node; Node next = null; Node newHead = null; // 新链表的头节点 while (current != null) { next = current.next; // 创建新节点 Node newNode = new Node(current.data); newNode.next = prev; prev = newNode; current = next; } newHead = prev; // 新链表的第一个节点是prev return newHead; }

在这个修改后的版本中,每次迭代都会创建一个新的节点,并将其添加到新链表的头部。这样,原始链表保持不变,反转链表是一个新的链表。2. 使用数组辅助判断

另一种方法是将链表中的所有节点值存储在一个数组中,然后检查该数组是否回文。

boolean isPalindrome(Node head) { List<Integer> list = new ArrayList<>(); Node cur = head; while (cur != null) { list.add(cur.data); cur = cur.next; } int left = 0; int right = list.size() - 1; while (left < right) { if (!list.get(left).equals(list.get(right))) { return false; } left++; right--; } return true; }

这种方法简单易懂,但需要额外的 O(n) 将数组存储在空间中。

3. 反转链表的一半

为了避免额外的空间开支,链表的前半部分只能反转。然后,将反转后的前半部分与后半部分进行比较。

boolean isPalindrome(Node head) { if (head == null || head.next == null) { return true; } Node slow = head; Node fast = head; while (fast != null && fast.next != null) { slow = slow.next; fast = fast.next.next; } // slow 指向中间节点 Node reversedHalf = reverseList(slow); // 反转后半部分 Node cur1 = head; Node cur2 = reversedHalf; while (cur2 != null) { if (cur1.data != cur2.data) { return false; } cur1 = cur1.next; cur2 = cur2.next; } return true; }

这种方法只逆转链表的一半,只需要常数级别的额外空间。

总结

在反转链表时,除非这是你的初衷,否则不要直接修改原链表的结构。如果您需要保留原始链表,请创建新的链表进行反转。此外,还可以考虑使用数组辅助判断或只反转链表的一半来解决问题。选择哪种方法取决于具体需求和空间复杂性。了解链表的结构和操作模式是解决此类问题的关键。

http://www.jsqmd.com/news/527927/

相关文章:

  • 解决A站视频离线保存难题的AcFunDown工具全解析
  • 2026年上海性价比高的无尘车间厂排名,哪家更值得选 - 工业品牌热点
  • 基于仿真计算的光纤传感器光纤光谱数据研究:全面考虑光纤参数的影响
  • Halcon 机器视觉:工作经验分享
  • 原圈科技AI营销:破解高净值行业获客难,实测ROI提升45%。
  • 从DANet到MANet:深入理解CVPR 2019与遥感分割中的注意力机制演进
  • VisionMaster实战:Group循环与数组数据格式化的5个避坑指南(附完整配置流程)
  • LFM2.5-1.2B-Thinking效果展示:Ollama本地运行商业计划书逻辑推演全过程
  • 剖析2026年口碑不错的哈尔滨汽车贴膜公司,怎么选择 - 工业推荐榜
  • UWB电子围栏方案:一体化设计,宠物防走失+训导双突破
  • 新手也能上手!高效论文写作全流程AI论文写作工具推荐(2026 最新)
  • SiameseUIE保姆级教学:从零配置到多轮测试的全生命周期操作
  • Sambert多情感语音合成镜像评测:开箱即用,部署快10倍,效果惊艳
  • 2026年找评价好的整形机生产厂家,看这篇,国内整形机禾胜层层把关品质优 - 品牌推荐师
  • 关于图像处理的基本思路
  • 2026年盘点哈尔滨能防油污车衣靠谱店铺,金马荣耀汽车贴膜上榜 - 工业品网
  • ROCm安装实战:Ubuntu 24.04系统中Release文件缺失问题深度解析
  • Stable Yogi Leather-Dress-Collection与QT框架集成:开发本地化设计工具
  • 终极指南:3分钟快速上手docx2tex,免费将Word文档转换为专业LaTeX
  • 2026年十大麻将机品牌最新榜单推荐:商用高频使用场景静音耐用口碑品牌分析 - 品牌推荐
  • 打破语言壁垒:FigmaCN让设计协作效率提升3倍的秘密
  • idea mybatisx插件 提示:can not found setter method
  • 多租户下的ERP系统下的仓储管理模块
  • 零代码玩转视频AI:Chord工具快速上手,实现视频内容智能解析
  • 旧电脑别扔!用TrueNAS Core零成本改造专业级NAS(附硬盘RAID配置建议)
  • 避坑指南:Jetson NX上GStreamer硬解码MP4/USB摄像头的常见问题解决方案
  • 家庭带娃
  • Java环境搭建时如何配置测试环境
  • 2026年度江浙沪地区25SiMo2MoVE厂家排名,哪家更有保障 - mypinpai
  • Windows 11终极优化指南:用Win11Debloat轻松清理系统垃圾