IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 链表的回文结构(面试题目) -> 正文阅读

[数据结构与算法]链表的回文结构(面试题目)

题目概述(简单难度)

对于一个链表,请设计一个时间复杂度为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 这个链表举例
首先寻找链表的中间节点
在这里插入图片描述
寻找过后slow指针和fast指针的位置,此时slow所指向的节点就是我们奇数链表的中间节点,下图中的奇数链表的中间节点为值域为78的这个节点.
在这里插入图片描述
寻找完成后开始定义新变量cur,curNext,开始反转链表,下面是反转链表完成后各个指针的位置:此时cur=curNext=null,slow和fast指针同时指向尾节点.
在这里插入图片描述
反转完成后,此时开始进行判断值域,head指针和slow指针开始向中间节点的位置遍历,在这两个指针还没有到中间节点前进行值域的判断只要有一次两个指针所指向的节点的值域不相同,那么就返回false,否则返回true.

(2):对于偶数链表,我们就拿24->12->12->24这个链表来举例:
我们在奇数链表的基础上加上了对于head.next==slow的判断,先来看为什么要加这个吧:
首先寻找链表的中间节点
在这里插入图片描述
寻找过后slow指针和fast指针的位置,此时slow所指向的节点就是我们偶数链表的中间节点,下图中的偶数链表的中间节点为第二个值域为12的这个节点.
在这里插入图片描述
寻找完成后开始定义新变量cur,curNext,开始反转链表,下面是反转链表完成后各个指针的位置:此时fast=cur=curNext=null,slow指向尾节点.
在这里插入图片描述
反转完成后,此时开始进行判断值域,head指针和slow指针开始向中间节点的位置遍历
在这里插入图片描述

当slow指针遍历到中间节点后,我们会发现此时当slow不能再往下了,原因是slow.next此时存储的地址是slow最开始所在的尾节点,head此时指向第二个节点,如果执行了slow=slow.next语句,相当于slow又回到了尾节点,这个时候的head也来到了中间节点处:如下所示:
在这里插入图片描述
此时继续执行if判断语句,head.val=12,slow.val=24,这两个不相等直接return false,相当于此时程序判断我们的偶数链表24->12->12->24不是一个回文链表,很显眼程序判断错误
所以当head.next=slow的时候,就说明我们偶数链表已经是一个回文链表了
return true即可.

总结

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

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-07 21:48:54  更:2021-08-07 21:49:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 19:13:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码