链表的回文结构(C++超详细讲解)

矫情吗;* 2022-12-30 08:10 215阅读 0赞

C++实现判断链表的回文结构

  • 思路
  • 代码实现

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

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

测试样例:

1->2->2->1

返回:true

思路

判断链表的回文结构,采取快慢指针的方法,即快指针一次走两步,慢指针一次走一步
可将链表分为两种情况

  • 链表含有偶数个节点
    首先通过慢指针找到中间节点,如下图所示,当fast==NULL时停止
    在这里插入图片描述
    将中间指针后面的节点逆置
    在这里插入图片描述

最后两个指针一个从左向右一个从右向左,当pleft->next==pright时结束
在这里插入图片描述

  • 链表含有奇数个节点的情况
    首先通过慢指针找到中间节点,当fast->next==NULL时结束
    在这里插入图片描述

然后逆置中间节点后的节点
在这里插入图片描述
最后两个指针一个从左向右一个从右向左,当plef==pright时结束
在这里插入图片描述

代码实现

  1. /*
  2. struct ListNode {
  3. int val;
  4. struct ListNode *next;
  5. ListNode(int x) : val(x), next(NULL) {}
  6. };*/
  7. class PalindromeList {
  8. public:
  9. bool chkPalindrome(ListNode* A) {
  10. //1、链表为空或者只有一个节点则返回true
  11. if(A==NULL || A->next==NULL)
  12. return true;
  13. //2.链表多于一个节点
  14. ListNode * pfast = A; //快指针
  15. ListNode * pslow = A; //慢指针
  16. //偶数个节点时fast==NULL结束,奇数个节点时fast->next==NULL结束
  17. //while循环的条件是继续的条件,而我们思考的是while停止的条件,因此条件是反过来的
  18. while(!(pfast == NULL || pfast->next == NULL))
  19. {
  20. pfast = pfast->next->next; //快指针一次走两步
  21. pslow = pslow->next; //慢指针一次走一步
  22. }
  23. //逆置节点,采用头插法,每次从链表中取出一个节点插入到pre节点之前
  24. ListNode * prev = pslow;
  25. pslow = pslow->next;
  26. prev->next = NULL; //中间节点置空
  27. while(pslow!=NULL)
  28. {
  29. ListNode * tmp =pslow->next; //保存当前节点的后一个节点防止丢失
  30. pslow->next=prev; //当前节点指向前一个节点
  31. prev=pslow; //prev和pslow分别后移
  32. pslow=tmp;
  33. }
  34. ListNode * pleft = A; //指向头节点
  35. ListNode * pright = prev; //指向尾节点
  36. while(!(pleft==pright || pleft->next == pright))
  37. {
  38. if(pleft->val != pright->val)
  39. return false;
  40. else
  41. {
  42. pleft = pleft->next;
  43. pright = pright->next;
  44. }
  45. }
  46. return true;
  47. }
  48. };

发表评论

表情:
评论列表 (有 0 条评论,215人围观)

还没有评论,来说两句吧...

相关阅读

    相关

    > 昨天练习了 [验证回文字符串][Link 1] ,回文的定义已经在该篇中定义过了,今天练习 [回文链表][Link 2]。 题目描述 请判断一个链表是否为回文链表。

    相关 结构

    题目描述 对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。 给定一个链表的头指针A,请返回一个bool值,代表其是否

    相关 结构

    回文链表 在我们的生活中经常会碰到这种回文的结构,回文就是反转以后和以前一样的就是回文结构,例如 1->2->3->2->1,我们将它反转之后还是与原链表一样,我们