K个一组反转链表

K个一组反转链表

题目:力扣25

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

k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

K个一组反转链表_第1张图片
例如:
输入: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;
    }
};

你可能感兴趣的:(算法,链表,数据结构)