栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

判断回文链表

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

判断回文链表

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

输入:head = [1,2,2,1]
输出:true

class Solution {

    public boolean isPalindrome(ListNode head) {
    ListNode first=head;
    ListNode slow=head;
    //这里的first写错了,应该是fast快指针和慢指针
    //注意这里while判断的顺序,先判断前面的,在判断后面的,不然会报错
    while(first!=null&&first.next!=null){
        first=first.next.next;
        slow=slow.next;
    }
    //fast是两个一加,如果fast不为空,说明链表是奇数,这个时候slow加一个
    if(first!=null){
        slow=slow.next;
    }

    slow=reverse(slow);
    
    first=head;
    
    两个同时判断就可以同时往后,直到slow为空截止
    while(slow!=null){
        if(first.val!=slow.val){
            return false;
        }
        first=first.next;
        slow=slow.next;
    }
    return true;
    }

    //反转链表
public ListNode reverse(ListNode head) {
    ListNode prev = null;
    while (head != null) {
        ListNode next = head.next;
        head.next = prev;
        prev = head;
        head = next;
    }
        return prev;

}
}

注意:node.next和node.next.next判断顺序要正确

链表反转学习:
https://mp.weixin.qq.com/s?__biz=MzU0ODMyNDk0Mw==&mid=2247488340&idx=1&sn=c3d6adc9f737672aab544931502dda2e&chksm=fb418074cc360962b46cb764068a5818f58bed6a4cd05ef61057823918d95f3a192550f02408&scene=21#wechat_redirect


反转就是把每个头结点重新赋值,然后直接把这个节点当成新的链表的头结点,所以新头结点的next是上一个新头结点,再把头结点赋值给新的头结点,头结点更新为之前保存的。所以需要保存旧的头结点的next,否则会丢掉。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/917004.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号