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

判断链表是否为回文

在这里插入图片描述
所谓回文,就是从前往后读和从后往前读都一样,比如 1→2→3→2→1 就是回文链表。

代码逻辑

1.找到链表的中点

ListNode slow = head, fast = head;
while (fast.next != null && fast.next.next != null) {slow = slow.next;fast = fast.next.next;
}

这里判断条件是 fast.next != null && fast.next.next != null,能保证 slow 最终停在中间偏左的位置,无论链表长度是奇数还是偶数都适用。

2.翻转后半部分链表

从中点开始,把后半部分链表反转。

反转后,链表变成了一个"双向箭头"的结构:前半部分从 head 指向中点,后半部分从尾部指向中点。

ListNode pre = slow;
ListNode cur = pre.next;
ListNode next = null;
pre.next = null;  // 断开前后两部分while (cur != null) {next = cur.next;      // 保存下一个节点cur.next = pre;       // 反转指针pre = cur;            // pre 前进cur = next;           // cur 前进
}

3.双指针比对值

现在有两个指针:left 从头开始往右走,right 从尾开始往左走。

每一步比对两个节点的值,如果不相等就说明不是回文。

boolean ans = true;
ListNode left = head;
ListNode right = pre;while (left != null && right != null) {if (left.val != right.val) {ans = false;break;}left = left.next;right = right.next;
}

4.恢复链表原状

判断完成后,不能把链表留成反转的状态,需要把后半部分再翻转回去。

cur = pre.next;
pre.next = null;
while (cur != null) {next = cur.next;cur.next = pre;pre = cur;cur = next;
}

完整代码

public static boolean isPalindrome(ListNode head) {if (head == null || head.next == null) {return true;}ListNode slow = head, fast = head;// 找中点while (fast.next != null && fast.next.next != null) {slow = slow.next;fast = fast.next.next;}// 翻转后半部分ListNode pre = slow;ListNode cur = pre.next;ListNode next = null;pre.next = null;while (cur != null) {next = cur.next;cur.next = pre;pre = cur;cur = next;}// 双指针比对boolean ans = true;ListNode left = head;ListNode right = pre;while (left != null && right != null) {if (left.val != right.val) {ans = false;break;}left = left.next;right = right.next;}// 恢复链表cur = pre.next;pre.next = null;while (cur != null) {next = cur.next;cur.next = pre;pre = cur;cur = next;}return ans;
}
http://www.dtcms.com/a/496158.html

相关文章:

  • 知名设计网站公司想学网络运营怎么开始
  • AI产品经理学习笔记4 - Agent的技术框架
  • 中国住房和建设部网站首都之窗官网
  • 淘宝买cdk自己做网站湖北手机网站制作
  • JavaSE面向对象(下)
  • 网站怎么做前台跟后台的接口小说网站推广方式
  • Node.js v25 重磅发布!革新与飞跃:深入探索 JavaScript 运行时的未来
  • 2一、u-boot下载编译
  • C++ MFC控件实现小型通讯录
  • 东莞网站优化一般多少钱深圳网站seo优化公司
  • 免费制作app生成器网站馆陶网站建设电话
  • 从发币到行为经济:BSC 发币工具演化的下一站
  • 优秀企业网站wordpress导航怎么设置
  • 自己的主机做服务器网站如何备案企业融资流程
  • 通过强化学习让多模态大模型自主决策图像token压缩的新范式-VisionThink实现思路及奖励函数设计
  • 【C++】深入理解vector(1):vector的使用和OJ题
  • 前端最新Vue2+Vue3基础入门到实战项目9-10
  • UC3842/3845/2842/2845 软启动
  • 免费推广产品的网站年报申报入口官网
  • 做网站答辩三网合一营销型全网站
  • (定时任务)@Scheduled 到 XXL-Job:两种定时任务机制的核心区别
  • 【VSCode】Visual Studio Code 2024安装包及安装教程 (附所有版本下载)
  • java17中,使用原生url connection的方式去创建的http链接,使用的是http1.1还是2.0?
  • 无人机激光避障技术概述
  • 网站空间带宽t型布局网站的样子
  • 【测试】Web安全测试与自动化筛查
  • 上海黄浦 网站建设wordpress图床首页无缩略图
  • 免费手机建站平台杭州最大定制app开发公司
  • asp做的网站后台怎么进去wordpress文章推送公众号
  • Scrapy vs Requests:什么时候该用哪个爬虫框架?