牛客-c语言刷题-链表中的节点每k个一组翻转

题目连接:链表中的节点每k个一组翻转_牛客题霸_牛客网 (nowcoder.com)

题目描述:

将给出的链表中的节点每 k 个一组翻转,返回翻转后的链表
如果链表中的节点数不是 k 的倍数,将最后剩下的节点保持原样
你不能更改节点中的值,只能更改节点本身。

数据范围:  0≤n≤2000 , 1≤k≤2000 ,链表中每个元素都满足 0≤val≤1000
要求空间复杂度 O(1),时间复杂度O(n)

例如:

给定的链表是 1→2→3→4→5

对于 k=2 , 你应该返回 2→1→4→3→5

对于k=3 , 你应该返回 3→2→1→4→5

题目解析:

#include "stdio.h"
#include "stdlib.h"


/*
BM3 链表中的节点每k个一组翻转

描述
    将给出的链表中的节点每 k 个一组翻转,返回翻转后的链表
    如果链表中的节点数不是 k 的倍数,将最后剩下的节点保持原样
    你不能更改节点中的值,只能更改节点本身。

数据范围:   0≤n≤2000 , 1≤k≤2000 ,链表中每个元素都满足 0≤val≤1000
    要求空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)
例如:
给定的链表是  1→2→3→4→5
对于 k = 2  , 你应该返回  2→1→4→3→5
对于 k = 3  , 你应该返回  3→2→1→4→5
*/

/**************************code*****************************************/
 struct ListNode {
	int val;
	struct ListNode *next;
 };



struct ListNode* reverse(struct ListNode* head, int k){
    struct ListNode *cur, *next, *pre;
    pre = NULL, cur = head, next = head->next;
    while(k--){
        cur->next = pre;
        pre = cur;
        cur = next;
        next = next->next;
    }
    return pre;
}

struct ListNode* reverseKGroup(struct ListNode* head, int k ) {
    // write code here
    struct ListNode* dummyHead = (struct ListNode*)malloc(sizeof(struct ListNode));
    dummyHead->next = head;
    struct ListNode* revHead, *revEnd;
    int count = 0;
    revHead = dummyHead, revEnd = dummyHead->next;  //head表示反转区间前一个节点,end表示反转区间后一个节点

    if(k == 1)                  //如果k=1,则直接返回
        return dummyHead->next;

    while(revEnd){              //寻找区间节点过程中,如果区间后的节点不存在,则直接退出
        revEnd = revEnd->next;  //存在则指向下一个
        if(++count == k){       //如果找到一个满足k的区间,则开始反转
            revHead->next = reverse(revHead->next, k); //区间前一个节点的next  为  反转后链表
            while(count--){     //找到反转后的链表的 区间的末尾节点
                revHead = revHead->next;
            }
            revHead->next = revEnd; //此时head为反转好的区间的末尾节点,next指向之前保存的反转区间的后一个节点,
            //同时revHead处于下一区间的前一个节点。[2 1(head)] [3 4]
            count = 0;            //count置0
        }
    }
    return dummyHead->next;
}
/**************************end******************************************/

int main ()
{
    struct ListNode LN15={5,NULL};
    struct ListNode LN14={4,&LN15};
    struct ListNode LN13={3,&LN14};
    struct ListNode LN12={2,&LN13};//k=2   {2 1 4 3 5} 
    struct ListNode LN1 ={1,&LN12};//k=3   {3 2 1 4 5} 

    struct ListNode LN2 = {NULL,NULL};  //k=1 {}

    struct ListNode LN3 = {NULL,NULL};
    struct ListNode LN4 = {NULL,NULL};

    struct ListNode *pLN = reverseKGroup(&LN1, 2);

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值