当前位置:   article > 正文

C语言习题——链表的回文结构_链表回文结构c

链表回文结构c


 

如果是数组的话,直接找到中间下标,然后用两个指针,一个指向首元素,另一个指向最后一个元素,然后同时向中间走就能判断,但对于单链表来说,找到中间的结点是不能用下标访问的,所以采用快慢指针法,即慢指针一次走一步,快指针一次走两步,对于同一个链表,快指针的速度是慢指针的二倍,所以当快指针走到空,慢指针就走到了链表的中间位置,所以此时慢指针的位置就是“中间位置”,然后为了使后半部分和前半部分比较,要将后半部分的链表逆置,这样就能比较了。

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

代码如下:

  1. struct ListNode* reverseList(struct ListNode* head){//逆置
  2. struct ListNode* n1 = NULL;
  3. struct ListNode* n2 = head;
  4. while(n2)
  5. {
  6. struct ListNode* n3 = n2->next;
  7. //转向
  8. n2->next = n1;
  9. //迭代
  10. n1 = n2;
  11. n2 = n3;
  12. if(n3)
  13. {
  14. n3 = n3->next;
  15. }
  16. }
  17. return n1;
  18. }
  19. struct ListNode* middleNode(struct ListNode* head){//中间结点
  20. struct ListNode* fast = head;
  21. struct ListNode* slow = head;
  22. while(fast != NULL && fast->next != NULL)
  23. {
  24. fast = fast->next->next;
  25. slow = slow->next;
  26. }
  27. return slow;
  28. }
  29. class PalindromeList {
  30. public:
  31. bool chkPalindrome(ListNode* A) {
  32. // write code here
  33. struct ListNode* head = A;
  34. struct ListNode* mid = NULL;
  35. mid = middleNode(head);
  36. struct ListNode* rhead = NULL;
  37. rhead = reverseList(mid);
  38. while(head && rhead)
  39. {
  40. if(head->val != rhead->val)
  41. {
  42. return false;
  43. }
  44. head = head->next;
  45. rhead = rhead->next;
  46. }
  47. return true;
  48. }
  49. };

水平有限,欢迎指正

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

闽ICP备14008679号