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

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

✨hello,进来的小伙伴们,你们好耶!✨

🍖🍖系列专栏:【牛客刷题】

🍈🍈作者简介:一名双非本科大三在读的Java编程小白,启夜星辰,你我同行!

🥟🥟给大家推荐一个超级好用的刷题网站——牛客网

问题描述

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

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

测试样例:

1->2->2->1

返回:true

解题思路

思路: 1.首选判断链表是否为空。

2.找中点:设置两个引用fast、slow从头开始走,fast每次走两个节点,slow每次走一个节点,当fast走到链表尾,slow正好走到链表中点。

3.翻转后段链表:设置一个cur引用,让他置于中点的下一个节点cur=slow.next,从cur开始将节点指向逆向翻转,每次翻转完成slow向后走一步slow=cur,让slow走到尾部。

4.分别从链表头尾两端开始比较,如果遇到val值不一样的情况,则不是回文,否则是回文。

5.注意这里我们需要判断偶数的情况,当我们的A.next == slow的时候那么就意味着前后已经遍历完成了,二者即将相遇,如果我们不加判断的话,那么A.next就会继续向下一个节点走,我们的slow也会往后走去,那么两者永远不能相遇,程序就出问题了。

   /*

   public class ListNode {

       int val;

       ListNode next = null;

       ListNode(int val) {

           this.val = val;

       }

   }*/

   public class PalindromeList {

       public boolean chkPalindrome(ListNode A) {

           if (A == null) {//没有节点

               return false;

           }

           if (A.next == null) { //只有一个节点 一定是回文结构

               return true;

           }

           //找到中点

           ListNode fast = A;

           ListNode slow = A;

           ListNode cur = A;

           while (fast != null && fast.next != null) {

               fast = fast.next.next;

               slow = slow.next;

           }

         

           //翻转

           cur = slow.next;

           while (cur != null) {

               ListNode curNext = cur.next;

               cur.next = slow;

               slow = cur;

               cur = curNext;

           }

   

           //比较

           while (A != slow) {

               if (A.val != slow.val) {//有一个不相等说明不是回文结构

                   return false;

               }

               if (A.next == slow) {

                   /*偶数情况下 A.next等于slow说明二者都遍历完成了,即将相遇,

                   那么证明这个结构已经是回文结构了

                   如果不加判断那么A继续next,slow继续next会往后走,就会判断错误!*/

                   return true;

               }

               A = A.next;

               slow = slow.next;

           }

           return true;

       }

   }

运行结果:

f3382c7431f0431e8cabbad4689ec077.png

相关文章
|
4月前
|
程序员
【刷题记录】移除链表元素
【刷题记录】移除链表元素
|
2月前
【数据结构】环形、相交、回文、分割、合并、反转链表
【数据结构】环形、相交、回文、分割、合并、反转链表
32 0
|
4月前
【刷题记录】链表的回文结构
【刷题记录】链表的回文结构
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
58 5
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 18. 删除链表的节点
Leetcode题目"剑指 Offer 18. 删除链表的节点"的Python解决方案,通过使用双指针法找到并删除链表中值为特定数值的节点,然后返回更新后的链表头节点。
46 4
|
4月前
|
存储 Java 开发者
揭秘!HashMap底层结构大起底:从数组到链表,再到红黑树,Java性能优化的秘密武器!
【8月更文挑战第24天】HashMap是Java集合框架中的核心组件,以其高效的键值对存储和快速访问能力广受开发者欢迎。在JDK 1.8及以后版本中,HashMap采用了数组+链表+红黑树的混合结构,实现了高性能的同时解决了哈希冲突问题。数组作为基石确保了快速定位;链表则用于处理哈希冲突;而当链表长度达到一定阈值时,通过转换为红黑树进一步提升性能。此外,HashMap还具备动态扩容机制,当负载因子超过预设值时自动扩大容量并重新哈希,确保整体性能。通过对HashMap底层结构的深入了解,我们可以更好地利用其优势解决实际开发中的问题。
125 0
|
4月前
|
机器学习/深度学习
【刷题记录】相交链表
【刷题记录】相交链表
|
4月前
【刷题记录】链表的中间结点
【刷题记录】链表的中间结点
|
6月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
6月前
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表