当前位置:   article > 正文

【数据结构】用C语言判断链表的回文结构_c链表回文

c链表回文

题目:

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

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

测试样例:

1->2->2->1

返回:true

方法:

1、找到中间结点(使用快慢指针)

2、逆置中间结点及其后面的结点

具体代码实现如下:

  1. /*
  2. struct ListNode {
  3. int val;
  4. struct ListNode *next;
  5. ListNode(int x) : val(x), next(NULL) {}
  6. };*/
  7. typedef struct ListNode ListNode;
  8. class PalindromeList {
  9. public:
  10. struct ListNode* reverselist(struct ListNode* head)
  11. {
  12. //处理空链表
  13. if(head == NULL)
  14. {
  15. return head;
  16. }
  17. //创建三个指针,分别记录前驱结点,当前结点,后继结点,改变原链表指针指向
  18. ListNode* n1,*n2,*n3;
  19. n1 = NULL,n2 = head,n3 = head->next;
  20. //遍历原链表,修改结点指针的指向
  21. ListNode* pcur = head;
  22. while(n2)
  23. {
  24. //修改n2的指向
  25. n2->next = n1;
  26. //修改三个指针的位置
  27. n1 = n2;
  28. n2 = n3;
  29. if(n3)
  30. {
  31. n3 = n3->next;
  32. }
  33. }
  34. return n1;
  35. }
  36. struct ListNode* middleNode(struct ListNode*head)
  37. {
  38. ListNode* slow = head,*fast = head;
  39. while(fast && fast->next)
  40. {
  41. slow = slow->next;
  42. fast = fast->next->next;
  43. }
  44. return slow;
  45. }
  46. bool chkPalindrome(ListNode* A) {
  47. ListNode* mid = middleNode(A);
  48. ListNode* rmid = reverselist(mid);
  49. while(A && rmid)
  50. {
  51. if(A->val != rmid->val)
  52. {
  53. return false;
  54. }
  55. A = A->next;
  56. rmid = rmid->next;
  57. }
  58. return true;
  59. }
  60. };

感谢观看,如有疑惑,我会尽力解答!

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

闽ICP备14008679号