前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >234 回文链表

234 回文链表

作者头像
木瓜煲鸡脚
发布2021-01-18 15:26:13
3640
发布2021-01-18 15:26:13
举报
文章被收录于专栏:Jasper小笔记

01

题目信息

题目地址: https://leetcode-cn.com/problems/palindrome-linked-list/

请判断一个链表是否为回文链表。

示例 1:

代码语言:javascript
复制
输入: 1->2
输出: false

示例 2:

代码语言:javascript
复制
输入: 1->2->2->1
输出: true

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

02

解法一:数组

比较容易想到的就是使用另一个容器存节点,再比较值,这里存到数组进行首尾比较

代码语言:javascript
复制
public boolean isPalindrome(ListNode head) {
    List<Integer> vals = new ArrayList();
    // 将链表的值复制到数组中
    ListNode cur = head;
    while (cur != null) {
        vals.add(cur.val);
        cur = cur.next;
    }
    // 使用双指针判断是否回文
    int length = vals.size();
    for(int i = 0, j = length -1; i < length/2; i++,j--){
        int val1 = vals.get(i);
        int val2 = vals.get(j);
        if( val1 != val2 ) return false;
    }
    return true;
}

03

解法二:快慢指针

我们仍然是要使空间复杂度为O(1) 的,所以还是要回到纯链表的操作。结合之前的练习可以采用原地链表反转的算法之后再和原链表挨个比较,整个反转再比较的话是行不通的因为我们要用原地的不存储另外的链表,并且本来只用比较一半,所以我们这里要去找到链表的中间,并把后一半反转再进行前一半比后一半即可。

通过快慢指针,fast为slow两倍速度,最后fast为空时slow就停在后一半的开头(长度为偶数)如果是奇数呢?

定位之后进行反转,再进行双指针比较直到后一半走完

代码如下:

代码语言:javascript
复制
public boolean isPalindrome(ListNode head) {
    ListNode fast = head; 
    ListNode slow = head;
    //通过快慢指针找到中点
    while (fast != null && fast.next != null) {
        fast = fast.next.next;
        slow = slow.next;
    }
    //如果fast不为空,说明链表的长度是奇数个
    if (fast != null) {
        slow = slow.next;
    }
    //反转后半部分链表
    slow = reverseList(slow);
    fast = head;
    while (slow != null) {
        //然后比较,判断节点值是否相等
        if (fast.val != slow.val) return false;
        fast = fast.next;
        slow = slow.next;
    }
    return true;
}
//反转链表
public ListNode reverseList(ListNode head) {
    ListNode cur = head;
    ListNode next = null;
    while( cur != null){
        //记住原链表的下一个
        ListNode temp = cur.next;
        //设下next
        cur.next = next;
        //更新next与cur
        next = cur;
        cur = temp;
    }
    return next;
}

04

总结

先是解法一也是和前面写的几题一样无脑解决的方式就是用另外的容器操作解除只能往下取的限制无论是数组也好还是也好都是用另外的容器直接进行我们想要的指针操作,接下来就是去挖掘链表的操作,只能next不能像数组一样任意使用索引的情况下我们怎么定位我们想要的地方,快慢指针的一个应用无论是在这题还有前面的删除倒数第几位的节点,以及明天要完成的一题环形链表都有体现。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT那个小笔记 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 01
  • 02
  • 03
  • 04
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档