当前位置:   article > 正文

【超详细】c语言实现链表分割_用c语言实现以下功能,将双向链表从给定的截断点分成两段,两段位置互换成新的链表,

用c语言实现以下功能,将双向链表从给定的截断点分成两段,两段位置互换成新的链表,

题目链接:链表分割_牛客题霸_牛客网

本题目在牛客网难度为较难,但是在整理思路画图后,题目难度并不大,下面说说我的思路

假设我们这里有一个链表为:2,3,5,1,7,2,然后找比4小的数字放在前面,比4大的数字放在后面,并且不改变原来的顺序,所以得出结果为:2,3,1,2,5,7

上来我们的链表应该是这样:

然后我们定义带哨兵卫的2个节点(用来保存小于4的节点和大于4的节点)

 

最后把2个链表连接起来(记住bigTail要置空并且smallTail->next指向为bigHead的下一个)

 

 代码如下:

  1. class Partition {
  2. public:
  3. ListNode* partition(ListNode* pHead, int x) {
  4. struct ListNode* cur=pHead;
  5. //保存小于x的值
  6. struct ListNode* smallHead=(struct ListNode*)malloc(sizeof(struct ListNode));
  7. smallHead->next=NULL;
  8. struct ListNode* smallTail=smallHead;
  9. //保存大于x的值
  10. struct ListNode* bigHead=(struct ListNode*)malloc(sizeof(struct ListNode));
  11. bigHead->next=NULL;
  12. struct ListNode* bigTail=bigHead;
  13. while(cur)
  14. {
  15. if(cur->val<x)
  16. {
  17. smallTail->next=cur;
  18. smallTail=smallTail->next;
  19. }
  20. else
  21. {
  22. bigTail->next=cur;
  23. bigTail=bigTail->next;
  24. }
  25. cur=cur->next;
  26. }
  27. //这里置空不能忘记,一开始我就没想到
  28. bigTail->next=NULL;
  29. smallTail->next=bigHead->next;
  30. free(bigHead);
  31. struct ListNode* copysmallHead=smallHead->next;
  32. free(smallHead);
  33. return copysmallHead;
  34. }
  35. };

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

闽ICP备14008679号