当前位置:   article > 正文

链表的回文结构_链表回文结构

链表回文结构

目录

一.题目及剖析

二.思路引入

三.代码引入

四.扩展


一.题目及剖析

https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?tab=note

描述

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

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

测试样例:

1->2->2->1
返回:true

众所周知,如果这道题的链表改为数组,这道题将十分简单,用左右指针就行,但人家说的是链表,显然左右指针是行不通的.

二.思路引入

1.找到链表的中间节点,将其分为两部分

2.将后半部分反转

3.如果反转后value与前半部分一样,则是回文结构

而前两步之前的我的博客有介绍

三.代码引入

  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. struct ListNode* intermediateNode(struct ListNode* head)
  10. {
  11. struct ListNode* slow, *fast;
  12. slow = fast = head;
  13. while(fast && fast->next)
  14. {
  15. fast = fast->next->next;
  16. slow = slow->next;
  17. }
  18. return slow;
  19. }
  20. struct ListNode* overturnList(struct ListNode* head)
  21. {
  22. struct ListNode *n1, *n2, *n3;
  23. n1 = NULL;
  24. n2 = n3 = head;
  25. if(head)
  26. n3 = head->next;
  27. while(n2)
  28. {
  29. n2->next = n1;
  30. n1 = n2;
  31. n2 = n3;
  32. if(n3)
  33. n3 = n3->next;
  34. }
  35. return n1;
  36. }
  37. bool chkPalindrome(ListNode* A) {
  38. // write code here
  39. struct ListNode* pcur = intermediateNode(A);
  40. struct ListNode* prev = overturnList(pcur);
  41. while(prev)
  42. {
  43. if(A->val != prev->val)
  44. return false;
  45. prev = prev->next;
  46. A = A->next;
  47. }
  48. return true;
  49. }
  50. };

四.扩展

当然对于这道题,我们还可以有其他的解法,比如遍历这个链表,将其中的value存放至一个数组中,然后我们就可以使用左右指针去解决,这个算法的时间复杂度是o(n+logn),而第一种方法的时间复杂度是o(n)

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

闽ICP备14008679号