当前位置:   article > 正文

【链表*】交换结点_链表交换节点

链表交换节点

只要涉及到链表结点的删除或交换,就必须新建虚拟头结点newHead->next=head,让f指针指向newHead作为前置结点指针(删除和交换都需要前置结点指针的),newHead当然不动,程序最后返回的是newHead->next。

 

两个两个地交换结点

两个两个地就地交换结点。

大致思路:

一定要先新建一个虚拟结点newHead,newHead->next=head,这样的话就算head被交换,最终返回的是newHead->next,也是正确的结果链表头结点。

交换的方法一定要注重逻辑,如图:1和2交换,先令1->next=3,然后再让2->next=1,并且让上一节点f->next=2.这之后呢,变化p和f指针的位置,继续下一次的两两交换。

AC代码:

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * ListNode *next;
  6. * ListNode(int x) : val(x), next(NULL) {}
  7. * };
  8. */
  9. class Solution {
  10. public:
  11. ListNode *swapPairs(ListNode *head) {
  12. if(head==NULL)
  13. return head;
  14. if(head->next==NULL)
  15. return head;
  16. ListNode *f = new ListNode(0);
  17. ListNode *real_head = f;
  18. f->next = head;
  19. ListNode *p = head;
  20. while(p!=NULL && p->next!=NULL)
  21. {
  22. ListNode *q = p->next;
  23. p->next = q->next;
  24. q->next = p;
  25. f->next = q;
  26. f = p;
  27. p = p->next;
  28. }
  29. return real_head->next;
  30. }
  31. };

 

 

K个K个地交换

这次是每轮要有K个交换,如果最后一轮不足K个则不动。

大致思路:

 

设置虚拟头结点newHead是肯定需要的!

不同点在于,需要先去找到后面的第k-1个,先把下一轮的头找到(比如这里的4),1->next=4之后,再进行k-1次的头插,这之后,让f=1,p=4,开始下一轮。

我觉得我编程中出现了比较傻的问题就是把while写成if了。。。还看半天看不出来。。。这要不得哈。。。然后,一定要注意这种承接关系(比如4和1)在交换之前先保存好。

AC代码:

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * ListNode *next;
  6. * ListNode(int x) : val(x), next(NULL) {}
  7. * };
  8. */
  9. class Solution {
  10. public:
  11. int k;
  12. ListNode *reverseKGroup(ListNode *head, int kk) {
  13. k=kk;
  14. if(k==0 || k==1)
  15. return head;
  16. if(head==NULL)
  17. return head;
  18. if(head->next==NULL)
  19. return head;
  20. ListNode *f = new ListNode(0);
  21. ListNode *real_head = f;
  22. f->next = head;
  23. ListNode *p = head;
  24. while(p!=NULL)
  25. {
  26. int cnt=0;
  27. ListNode *q = p;
  28. while(q->next!=NULL)
  29. {
  30. cnt++;
  31. q=q->next;
  32. if(cnt==k-1)
  33. break;
  34. }
  35. if(cnt<k-1)
  36. break;
  37. ListNode *next_head = q->next;
  38. q = p->next;
  39. p->next=next_head;
  40. ListNode *this_tail = p;
  41. for(int i=0;i<k-1;i++)
  42. {
  43. ListNode *a = q;
  44. q = q->next;
  45. a->next=p;
  46. p = a;
  47. f->next = a;
  48. }
  49. p = next_head;
  50. f = this_tail;
  51. }
  52. return real_head->next;
  53. }
  54. };

 

 

 

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

闽ICP备14008679号