【每日一题】牛客网——链表的回文结构

简介: 【每日一题】牛客网——链表的回文结构

1. 题目描述

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

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


测试样例:

输入:1->2->2->1

输出:true

题目链接🔗


2. 思路

  1. 判断链表是否为空,如果为空,那么链表就是回文的
  2. 找到中间元素
  1. 定义两个指针slowfastfast每次移动两步,slow每次移动一步,当fast走到链表中的最后一个节点是,slow就指向了链表的中间节点。


反转链表后半部分的元素


  1. 定义指针cur指向中间节点的next
  2. 从中间节点循环遍历链表
  3. 定义指针curNext指向curnext(保存下一个节点)
  4. 将当前节点的next指向slow
  5. slow移动到当前节点的cur位置
  6. cur移动到下一个节点



同时遍历反转后的链表和原始链表的前半部分,并比较每个节点的值。如果所有的节点都匹配,那么链表就是回文;否则它不是回文。


  1. 一个从前一个从后循环遍历链表,直到相遇
  2. 判断两个当前节点是否相同,如果不同返回false
  3. 如果相同判断headnext等不等于slow,如果等于直接返回true(链表节点个数为偶数个)
  4. head移动到下一个节点
  5. slow移动到下一个节点



3. 代码

import java.util.*;

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class PalindromeList {
    public boolean chkPalindrome(ListNode head) {
        if (head == null) {
            return true;
        }
        // write code here
        // 1.找到中间元素
        ListNode fast = head;
        ListNode slow = head;

        while (fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
        }

        // 2.反转链表
        ListNode cur = slow.next;
        while (cur != null) {
            ListNode curNext = cur.next;
            cur.next = slow;
            slow = cur;
            cur = curNext;
        }

        // 3.一个向后遍历一个向前遍历
        while (slow != head) {
            if (slow.val != head.val) {
                return false;
            }
            if (head.next == slow) {
                return true;
            }
            head = head.next;
            slow = slow.next;
        }
        return true;
    }
}


运行结果:



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