前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >LeetCode:回文链表_234

LeetCode:回文链表_234

作者头像
Yuyy
发布2022-06-28 20:39:34
发布2022-06-28 20:39:34
14300
代码可运行
举报
运行总次数:0
代码可运行

思路

简单的方法是遍历一边链表,存入数组,再从首尾往中间判断是否相等。但是题目说了,进阶的解法是空间复杂度为O(1),首先排除递归反转链表,倒是可以利用迭代来反转链表。在优化下,不用反转整条链表来比较,只需反转半条即可。

一次就AC了,爽

题目

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false

示例 1:

代码语言:javascript
代码运行次数:0
复制
输入:head = [1,2,2,1]
输出:true

示例 2:

代码语言:javascript
代码运行次数:0
复制
输入:head = [1,2]
输出:false

提示:

  • 链表中节点数目在范围[1, 105]
  • 0 <= Node.val <= 9

进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

Related Topics

  • 递归
  • 链表
  • 双指针
  • 👍 1140
  • 👎 0

代码

代码语言:javascript
代码运行次数:0
复制
        public boolean isPalindrome(ListNode head) {
            // 注意链表长度为1的情况

            // 利用快慢指针找出链表中点
            ListNode dummy = new ListNode(-1, head);
            ListNode slow = dummy, fast = dummy;
            while (fast.next != null) {
                slow = slow.next;
                fast = fast.next;
                if (fast.next != null) {
                    fast = fast.next;
                }
            }

            // 反转后半段链表
            ListNode pre = null;
            ListNode curr = slow.next;
            while (curr != null) {
                ListNode next = curr.next;
                curr.next = pre;
                pre = curr;
                curr = next;
            }

            // 前半段链表和反转过的后半段链表相比较
            ListNode front = head, back = pre;
            while (back != null) {
                if (front.val != back.val) {
                    return false;
                }
                front = front.next;
                back = back.next;
            }

            return true;
        }

Post Views: 173

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-10-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 思路
  • 题目
  • 代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档