链表的回文结构(简单难度)

简介: 链表的回文结构(简单难度)

题目概述(简单难度)

对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。

给定一个链表的头指针A,请返回一个boolean值,代表其是否为回文结构。保证链表长度小于等于900。


示例 1:

输入: 1->2
输出: false

示例 2:

输入: 1->2->2->1
输出: true


在此附上牛客网和leetcode的题目链接:

点击此处进入leetcode

点击此处进入牛客网


思路与代码

思路展现

回文结构

这道题目是需要我们判断一个链表是否为回文结构,那么首先我们来了解下什么是回文结构吧:


反转之后还是与原链表一样,就是回文结构。


那么对于一个奇数链表和偶数链表(这里的奇偶数指的就是链表中节点的个数)而言,都是存在回文链表的:举个例子:


奇数链表:24->12->78->12->24

偶数链表:24->12->12->24


因为有了不同的情况,我们的代码就必须将两种情况全部兼顾:


核心思路

对于回文链表的思路是这样的:

1:找到链表的中间节点,奇数链表和偶数链表的中间节点各不相同,这里我们使用快慢指针的方法,如果有小伙伴忘了快慢指针是如何找到的,可以参考我之前的博客链接:

点击此处进入博客

2:从中间节点后一个节点开始到尾节点全部进行反转。反转的思路可以参考我之前的博客,使用的是迭代法,这里就不再进行过多的赘述:

点击此处进入博客

3:反转完毕后,分别同时从头节点和尾节点开始遍历链表,然后判断节点对应的值域是否相同,相同返回true,说明是回文链表,不相同返回false,说明不是回文链表,当然这里对于偶数链表来说还有一个特殊情况,我们待会再来根据代码和图进行分析.


代码示例

class Solution {
    public boolean isPalindrome(ListNode head) {
       //链表为空的情况
        if(head==null){
            return false;  
        }
         ListNode slow=head;
         ListNode fast=head;
         //寻找中间节点
         while(fast!=null&&fast.next!=null){
             slow=slow.next;
             fast=fast.next.next;
         }
        //反转链表
         ListNode cur=slow.next;
         while(cur!=null){
             ListNode curNext=cur.next;
             cur.next=slow;
             slow=cur;
             cur=curNext;
         }
         //判断前后是否相等
         while(head!=slow){
             if(head.val!=slow.val){
                 return false;
             }
             //偶数的情况
             if(head.next==slow){
                 return true;
             }
             head=head.next;
             slow=slow.next;
         }
        return true;
    }
}

代码解析

1:对于寻找中间节点和反转链表的代码我就不再做过多的阐述了,这个可以去看我之前的博客,、

2:这里我主要介绍下对比这里的代码

(1):首先我们先来看奇数链表:拿24->12->78->12->24 这个链表举例

首先寻找链表的中间节点

2.png

寻找过后slow指针和fast指针的位置,此时slow所指向的节点就是我们奇数链表的中间节点,下图中的奇数链表的中间节点为值域为78的这个节点.

2.png

寻找完成后开始定义新变量cur,curNext,开始反转链表,下面是反转链表完成后各个指针的位置:此时cur=curNext=null,slow和fast指针同时指向尾节点.

2.png

反转完成后,此时开始进行判断值域,head指针和slow指针开始向中间节点的位置遍历,在这两个指针还没有到中间节点前进行值域的判断只要有一次两个指针所指向的节点的值域不相同,那么就返回false,否则返回true.


(2):对于偶数链表,我们就拿24->12->12->24这个链表来举例:

我们在奇数链表的基础上加上了对于head.next==slow的判断,先来看为什么要加这个吧:

首先寻找链表的中间节点

2.png

寻找过后slow指针和fast指针的位置,此时slow所指向的节点就是我们偶数链表的中间节点,下图中的偶数链表的中间节点为第二个值域为12的这个节点.

2.png

寻找完成后开始定义新变量cur,curNext,开始反转链表,下面是反转链表完成后各个指针的位置:此时fast=cur=curNext=null,slow指向尾节点.

2.png

反转完成后,此时开始进行判断值域,head指针和slow指针开始向中间节点的位置遍历

2.png


当slow指针遍历到中间节点后,我们会发现此时当slow不能再往下了,原因是slow.next此时存储的地址是slow最开始所在的尾节点,head此时指向第二个节点,如果执行了slow=slow.next语句,相当于slow又回到了尾节点,这个时候的head也来到了中间节点处:如下所示:

2.png

此时继续执行if判断语句,head.val=12,slow.val=24,这两个不相等直接return false,相当于此时程序判断我们的偶数链表24->12->12->24不是一个回文链表,很显眼程序判断错误

所以当head.next=slow的时候,就说明我们偶数链表已经是一个回文链表了

return true即可.


总结

这道题目是很多道题目思路的综合版本,运用到了快慢指针和反转列表中的思路,并加以修饰便可以将这道题目快速解答了,但是仍需要注意细节点,例如奇偶数链表的判断.


相关文章
|
2月前
【刷题记录】链表的回文结构
【刷题记录】链表的回文结构
|
2月前
|
存储 Java 开发者
揭秘!HashMap底层结构大起底:从数组到链表,再到红黑树,Java性能优化的秘密武器!
【8月更文挑战第24天】HashMap是Java集合框架中的核心组件,以其高效的键值对存储和快速访问能力广受开发者欢迎。在JDK 1.8及以后版本中,HashMap采用了数组+链表+红黑树的混合结构,实现了高性能的同时解决了哈希冲突问题。数组作为基石确保了快速定位;链表则用于处理哈希冲突;而当链表长度达到一定阈值时,通过转换为红黑树进一步提升性能。此外,HashMap还具备动态扩容机制,当负载因子超过预设值时自动扩大容量并重新哈希,确保整体性能。通过对HashMap底层结构的深入了解,我们可以更好地利用其优势解决实际开发中的问题。
64 0
|
2月前
|
Python
【Leetcode刷题Python】234.回文链表
两种判断链表是否为回文的方法:使用栈和拆分为两个链表后反转对比,并给出了相应的Python代码实现。
17 0
|
3月前
【数据结构OJ题】链表的回文结构
牛客题目——链表的回文结构
31 0
【数据结构OJ题】链表的回文结构
|
4月前
|
存储 算法
数据结构和算法学习记录——二叉树的存储结构&二叉树的递归遍历(顺序存储结构、链表存储结构、先序中序后序递归遍历)
数据结构和算法学习记录——二叉树的存储结构&二叉树的递归遍历(顺序存储结构、链表存储结构、先序中序后序递归遍历)
25 0
数据结构和算法学习记录——二叉树的存储结构&二叉树的递归遍历(顺序存储结构、链表存储结构、先序中序后序递归遍历)
|
4月前
|
算法 C语言
【数据结构与算法 经典例题】链表的回文结构(图文详解)
【数据结构与算法 经典例题】链表的回文结构(图文详解)
|
4月前
|
存储
【数据结构】详解链表结构
【数据结构】详解链表结构
16 0
|
5月前
题目----力扣--回文链表
题目----力扣--回文链表
33 0
|
5月前
|
索引
【力扣刷题】回文链表、环形链表、合并两个有序链表
【力扣刷题】回文链表、环形链表、合并两个有序链表
34 0
|
5月前
|
算法
【每日一题】牛客网——链表的回文结构
【每日一题】牛客网——链表的回文结构