当前位置:   article > 正文

Java:如何判断一个链表是否为回文结构?(画图+代码 详解)_判断一个链表是否为回文链表java

判断一个链表是否为回文链表java

一、判断思想

        我们设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,我们在不创建额外空间的基础上来判断是否为回文结构。

思想:

1、使用快慢指针法,找到链表的中间节点。

2、翻转中间节点的后半部分。

3、分别从头节点和尾节点向中间遍历,直到相遇。如果在这个过程中头尾节点数值都相              等,则该链表结构为回文结构。

二、过程分析(以偶数节点为例)

1、找中间节点

使用快慢指针法,slow走一步,fast走两步。当fast走到空时,slow就在中间节点初。

由此就能找到中间节点slow

  1. ListNode slow = head;
  2. ListNode fast = head;
  3. while (fast != null && fast.next != null) {
  4. slow = slow.next;
  5. fast = fast.next.next;
  6. }

2、翻转后半部分链表

  1. //2、翻转
  2. ListNode cur = slow.next;
  3. while (cur != null) {
  4. ListNode curNext = cur.next;
  5. cur.next = slow;
  6. slow = cur;
  7. cur = curNext;
  8. }

3、遍历查找

如果是奇数情况,那么直接从后往前遍历,直到二者相遇即可;

如果是偶数情况,那么当二者的下一个节点为彼此时,就应该结束遍历了。

注意:单节点的链表是回文结构

三、代码实现

  1. public class Main{
  2. public boolean chkPalindrome(ListNode head) {
  3. //找到中间节点 把链表翻转 一个从后往前走 一个从前往后走
  4. //如果二者相遇的时候还都是一样的,就证明链表是回文的
  5. //如果只有一个节点 那肯定是回文的
  6. if(head.next == null) {
  7. return true;
  8. }
  9. //翻转链表
  10. //1、使用快慢指针找到中间位置
  11. ListNode slow = head;
  12. ListNode fast = head;
  13. while (fast != null && fast.next != null) {
  14. slow = slow.next;
  15. fast = fast.next.next;
  16. }
  17. ListNode cur = slow.next;
  18. //2、翻转
  19. while (cur != null) {
  20. ListNode curNext = cur.next;
  21. cur.next = slow;
  22. slow = cur;
  23. cur = curNext;
  24. }
  25. //翻转完之后开始查找 (考虑奇偶情况 )
  26. while (head != slow) {
  27. if(head.val != slow.val) {
  28. return false;
  29. }
  30. if(head.next == slow) {
  31. return true;
  32. }
  33. head = head.next;
  34. slow = slow.next;
  35. }
  36. return true;
  37. }
  38. }

        以上就是 Java:如何判断一个链表是否为回文结构?(画图+代码 详解)的全部内容了,希望能对您有所帮助! 您的点赞收藏就是对我最大的支持!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/934729
推荐阅读
相关标签
  

闽ICP备14008679号