leetcode.25.k个一组翻转链表

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

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

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

进阶:

你可以设计一个只使用常数额外空间的算法来解决此问题吗? 你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

示例 1:

https://assets.leetcode.com/uploads/2020/10/03/reverse_ex1.jpg

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

示例 2:

https://assets.leetcode.com/uploads/2020/10/03/reverse_ex2.jpg

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

示例 3:

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

示例 4:

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

提示:

1
2
3
4
列表中节点的数量在范围 sz 内
1 <= sz <= 5000
0 <= Node.val <= 1000
1 <= k <= sz
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#define Node ListNode
class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        if(head==NULL|| head->next ==NULL||k<=1) return head;
        int cnt=0;
        Node dummy(0);
        Node* pre = &dummy,*tail = pre;
        tail ->next = head;
        while(tail->next ) {
             
            for(int i=0;i<k && tail;i++) tail = tail->next;
            if(tail == NULL) break;
            //tail != null , reverse(pre->next,tail) + rev[ tail->next ]
             
            Node *temp = tail->next;
            tail->next = NULL;
            Node * newTail = pre->next;//将会成为 新的尾节点
            Node * newHead = rev(newTail);//newHead,新的头节点
            pre->next = newHead;
            pre = newTail;
            tail = newTail;
            tail ->next = temp;

        }
        return dummy.next;


    }
    Node*rev(Node*h) {
        Node*pre  = NULL;
        while(h) {
            Node*t = h->next;
            h->next = pre;
            pre = h;
            h = t;
        }
        return pre;

    }
};