当前位置:   article > 正文

LeetCode_链表的回文结构

LeetCode_链表的回文结构

✨✨所属专栏:LeetCode刷题专栏✨✨

✨✨作者主页:嶔某✨✨

题目描述:

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

就比如:1->2->3->2->1就是回文链表,1->2->3->1->2不是回文链表。

示例代码:

  1. class PalindromeList {
  2. public:
  3. bool chkPalindrome(ListNode* A) {
  4. // write code here
  5. };

 分析:

这里我们得到解法是先找到链表的中间节点,之后将中间节点后面的节点全部逆置。之后再从mid节点和链表头节点开始遍历、判断值是否相同,以mid节点和链表头节点都不为空为循环条件。

 所以这里我们先要写出找中间节点的代码:

以前做过类似的题《快慢指针》。快指针一次走两步,慢指针一次走一步。最终慢指针会停在中间节点处。

 注意:这里while循环的条件不能把fast->next放在前面,要先判断的fast不为空,再判断fast的下一个节点是否为空。否则会导致空指针的解引用。

  1. struct ListNode* middleNode(struct ListNode* head) {
  2. struct ListNode* fast = head, *slow = head;
  3. while(fast && fast->next) {
  4. slow = slow->next;
  5. fast = fast->next->next;
  6. }
  7. return slow;
  8. }

链表逆置代码:

  1. struct ListNode* ReverseList(struct ListNode* head ) {
  2. struct ListNode* pcur = head;
  3. struct ListNode* prev = NULL;
  4. while(pcur)
  5. {
  6. struct ListNode* tmp = pcur->next;
  7. pcur->next = prev;
  8. prev = pcur;
  9. pcur = tmp;
  10. }
  11. return prev;
  12. }

 主代码:

  1. class PalindromeList {
  2. public:
  3. bool chkPalindrome(ListNode* A) {
  4. // write code here
  5. struct ListNode* mid = middleNode(A);
  6. struct ListNode* rmid = ReverseList(mid);
  7. while(A && rmid)
  8. {
  9. if(A->val != rmid->val)
  10. return false;
  11. A = A->next;
  12. rmid = rmid->next;
  13. }
  14. return true;
  15. }
  16. };

本期博客到这里就结束了,如果有什么错误,欢迎指出,如果对你有帮助,请点个赞,谢谢!

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

闽ICP备14008679号