当前位置:   article > 正文

分割链表和回文链表习题

分割链表和回文链表习题

感谢大佬的光临各位,希望和大家一起进步,望得到你的三连,互三支持,一起进步

个人主页LaNzikinh-CSDN博客

收入专栏:初阶数据结构_LaNzikinh篮子的博客-CSDN博客


一.回文链表LCR 027. 回文链表 - 力扣(LeetCode)

给定一个链表的 头节点 head ,请判断其是否为回文链表。

如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。

示例 1:

输入: head = [1,2,3,3,2,1]输出: true

示例 2:

输入: head = [1,2]输出: false

思路:先找到中间结点,然后逆置,逆置完后在进行比较,比较完后如果一直相等,那就正确,不相等那就错误奇数偶数一样

偶数

奇数

之前写过一个反转链表的代码http://t.csdnimg.cn/tcPai,这次就来教一下如何求链表的中间节点,就是快慢指针的思想,快的走两步,慢的走一步

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

实现

  1. bool isPalindrome(struct ListNode* head)
  2. {
  3. //求中间结点
  4. struct ListNode* mid = midd(head);
  5. //中间结点逆置
  6. struct ListNode* rhead = rereverList(mid);
  7. //两个链表判断
  8. struct ListNode* curA = head;
  9. struct ListNode* curB = rhead;
  10. //一个结束就停止循环
  11. while (curA && curB)
  12. {
  13. //不相等就停
  14. if (curA->val != curB->val)
  15. return false;
  16. //相等就继续走
  17. else
  18. {
  19. curA = curA->next;
  20. curB = curB->next;
  21. }
  22. }
  23. return true;
  24. }

二.分割链表面试题 02.04. 分割链表 - 力扣(LeetCode)

给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。

你不需要 保留 每个分区中各节点的初始相对位置。

示例 1:

输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]

示例 2:

输入:head = [2,1], x = 2
输出:[1,2]

思路:开哨兵为的头节点,搞两个链表在合并

但是注意!!!存在问题,因为之前可能已经有连好的存在,所以最后还要解开

  1. struct ListNode* partition(struct ListNode* head, int x)
  2. {
  3. struct ListNode* LessHead, * LessTail, * greaterHead, * greatertail;
  4. //开辟哨兵位的头结点
  5. LessHead = LessTail = (struct ListNode*)malloc(sizeof(struct ListNode*));
  6. greaterHead = greatertail = (struct ListNode*)malloc(sizeof(struct ListNode*));
  7. LessTail->next = NULL;
  8. greatertail->next = NULL;
  9. struct ListNode* cur = head;
  10. //当cur走完,循环停止
  11. while (cur)
  12. {
  13. //如果小,放入less链表中
  14. if (cur->val < x)
  15. {
  16. LessTail->next = cur;
  17. LessTail = cur;
  18. }
  19. //如果大于等于,放入greater链表中
  20. else
  21. {
  22. greatertail->next = cur;
  23. greatertail = cur;
  24. }
  25. cur = cur->next;
  26. }
  27. //最后把链表合并
  28. LessTail->next = greaterHead->next;
  29. //解开已经有连好的存在
  30. greatertail = NULL;
  31. //存储哨兵位前的元素,释放哨兵位的头结点
  32. struct ListNode* newhead = LessHead->next;
  33. free(LessHead);
  34. free(greaterHead);
  35. return newhead;
  36. }

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

闽ICP备14008679号