当前位置:   article > 正文

LeetCode25.K个一组翻转链表_给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 k 是一个正整数,

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 k 是一个正整数,

1、题目描述

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

示例 :

给定这个链表:1->2->3->4->5

当 k = 2 时,应当返回: 2->1->4->3->5

当 k = 3 时,应当返回: 3->2->1->4->5

说明 :

  • 你的算法只能使用常数的额外空间。
  • 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

2、解题思路

(1)遍历原链表,同时建立一条新链表,分别用newHead和newTail表示头尾指针;

(2)遍历原链表时,每K个为一组,反转后放在前面处理过的链表后面(即插入到newTail节点后面,实现代码中为了代码简洁使用了stack暂存节点。

(3)为了方便操作,我们新建一个新的节点作为辅助头结点。

3、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* reverseKGroup(ListNode* head, int k) {
  12. ListNode* p = head, *newHead = new ListNode(0);
  13. ListNode *newTail = newHead, *tmp = NULL;//newHead为辅助头结点
  14. stack<ListNode*> s;//用栈存储每组的链表节点
  15. while (p)
  16. {
  17. tmp = p;
  18. p = p->next;
  19. tmp->next = NULL;
  20. s.push(tmp);
  21. if(s.size() == k)
  22. {//当栈存够K个节点(刚好一组)的时候,依次出栈按尾插法将出栈节点放在newTail后面
  23. while (!s.empty())
  24. {
  25. newTail->next = s.top();
  26. s.pop();
  27. newTail = newTail->next;
  28. }
  29. }
  30. }
  31. if(s.size() != 0)
  32. {//考虑最后不够K个节点,那么则用头插法将栈中的节点连接起来放在newTail后面,保证原有顺序
  33. ListNode* remainHead = NULL;
  34. while (!s.empty())
  35. {
  36. tmp = s.top();
  37. s.pop();
  38. tmp->next = remainHead;
  39. remainHead = tmp;
  40. }
  41. newTail->next = remainHead;
  42. }
  43. ListNode* res = newHead->next;
  44. delete newHead;
  45. return res;
  46. }
  47. };

 

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

闽ICP备14008679号