题目

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

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

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

示例 :

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

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

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

解析

只要会对整个链表进行翻转,这题是不难的。
需要注意的是代码中指针tail和cnt的初值,一定要自洽

代码

  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* dummy = new ListNode(0);
  13. dummy->next = head;
  14. ListNode* pre = dummy;
  15. ListNode* tail = dummy->next;
  16. int cnt = 1;
  17. while (tail) {
  18. if (cnt != k) {
  19. tail = tail->next;
  20. ++cnt;
  21. } else {
  22. ListNode* p = pre->next;
  23. tail = tail->next;
  24. while (p->next != tail) {
  25. ListNode* nxt = p->next;
  26. p->next = nxt->next;
  27. nxt->next = pre->next;
  28. pre->next = nxt;
  29. }
  30. cnt = 1;
  31. pre = p;
  32. // delete p;
  33. }
  34. }
  35. ListNode* retNode = dummy->next;
  36. delete dummy;
  37. return retNode;
  38. }
  39. };