当前位置:   article > 正文

牛客_OR36 链表的回文结构

or36 链表的回文结构

目录

一、题目

二、解题思路

三、解题代码


一、题目

题目链接:链表的回文结构_牛客题霸_牛客网 (nowcoder.com)

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

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

测试样例:

二、解题思路

先找到中间节点:然后再将在中间节点后面的节点逆置:然后再将逆置后的节点和原链表开始同时比较遍历。

  1. bool chkPalindrome(ListNode* A) {
  2. // write code here
  3. // 找中间节点
  4. ListNode* head = A;
  5. ListNode* rhead = FoundMid(head);
  6. // 逆置后半部分
  7. rhead = realse(rhead);
  8. // 遍历比较
  9. while (rhead)
  10. {
  11. if (rhead->val != head->val)
  12. {
  13. return false;
  14. }
  15. rhead = rhead->next;
  16. head = head->next;
  17. }
  18. return true;
  19. }

三、解题代码

  1. // 找中间节点
  2. ListNode* FoundMid(ListNode* head)
  3. {
  4. ListNode* fast = head;
  5. ListNode* slow = head;
  6. while (fast && fast->next)
  7. {
  8. fast = fast->next->next;
  9. slow = slow->next;
  10. }
  11. return slow;
  12. }
  13. // 逆置
  14. ListNode* realse(ListNode* head)
  15. {
  16. assert(head);
  17. ListNode* cur = head;
  18. ListNode* prev = NULL;
  19. ListNode* next = cur->next;
  20. while (cur)
  21. {
  22. cur->next = prev;
  23. prev = cur;
  24. cur = next;
  25. if (next != NULL)
  26. next = next->next;
  27. }
  28. return prev;
  29. }
  30. bool chkPalindrome(ListNode* A) {
  31. // write code here
  32. // 找中间节点
  33. ListNode* head = A;
  34. ListNode* rhead = FoundMid(head);
  35. // 逆置后半部分
  36. rhead = realse(rhead);
  37. // 遍历比较
  38. while (rhead)
  39. {
  40. if (rhead->val != head->val)
  41. {
  42. return false;
  43. }
  44. rhead = rhead->next;
  45. head = head->next;
  46. }
  47. return true;
  48. }

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

闽ICP备14008679号