K个一组反转链表
题目:力扣25
给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。
k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
例如:
输入:head = [1,2,3,4,5], k = 2
输出:[2,1,4,3,5]
思路:
1.先反转head开始的前k个节点
2.然后将k+1节点作为head递归调用reverseKGroup
3.将上述两步结果连接起来
代码实现
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public://反转区间[a,b)ListNode* reverse(ListNode* a,ListNode* b){//前驱节点ListNode* pre = NULL;//当前节点ListNode* cur = a;//后继节点ListNode* nxt = NULL;//反转while(cur != b){nxt = cur->next;cur->next = pre;pre = cur;cur = nxt;}return pre;}ListNode* reverseKGroup(ListNode* head, int k) {if(head == NULL)return NULL;ListNode* a = head;ListNode* b = head;for(int i = 1; i <= k; ++i){//不足k个直接返回if(b == NULL)return head;b = b->next;}//记录反转后的头ListNode* newHead = reverse(a,b);//连接反转完成的和未反转的a->next = reverseKGroup(b,k);return newHead;}
};