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

题目

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

数据范围: 0≤n≤2000 , 11≤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

代码

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param head ListNode类 
 * @param k int整型 
 * @return ListNode类
 */
typedef struct ListNode* pnode; 
static struct ListNode* ReverseList(struct ListNode* pHead ) {
    // write code here
    pnode p = NULL ;
    pnode q = pHead;
    while(q)
    {
        pnode m = q->next;
        q->next = p ;
        p = q ;
        q = m ;
    }
    return p;
}

struct ListNode* reverseKGroup(struct ListNode* head, int k ) {
    // write code here
    if(k<=1)return head;
    struct ListNode tmphead = {.val = -1 , .next = head};
    pnode pthead = &tmphead;
    pnode p_pre = pthead;
    pnode p = pthead->next;
    pnode q = pthead->next;
    pnode q_next = NULL;
    bool loop = true;
    while(loop)
    {
        for(int i = 1 ; i<k ; i++)
        {
            if(q)
            {
                q=q->next;
                q_next = q;
            }else{
                loop = false;
            }
        }
        
        if(loop)
        {   
            if(q){
                q_next = q->next;
                q->next = NULL;
            }else{
                loop=false; // 在上述中q=NULL也会被算作一个有效元素 所以要去掉
                continue;
            }
            p_pre->next = ReverseList(p);
            p->next = q_next;
            p_pre = p;
            p = q = q_next;
        }
    }
    return pthead->next;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值