Leetcode 25. Reverse Nodes in k-Group

博客给出了 LeetCode 上 K 个一组反转链表题目的链接,还转载了相关题解的博客链接,涉及数据结构与算法领域。

https://leetcode.com/problems/reverse-nodes-in-k-group/

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        /*
        和24题类似
        因为常数空间,故需要先判断后k个指针是否完整存在
        交换时,第i个与第i+1个指针改成p[i+1]->next=p[i],【i=1,...k-1】
        记录第1个后第k个指针,第k+1个指针
        
        pl->next=prnext
        pre->next=pr
        
        pre=pl
        */
        ListNode* pre=new ListNode(0),*pp=pre,*pl,*pr,*pt,*p1,*p2;
        pre->next=head;
        while(1){
            //判断后面是否有k个,若没有则结束
            pl=pre->next;
            pr=pre;
            for(int i=0;i<k;++i){
                if(pr->next) pr=pr->next;
                else{
                    //没有k个
                    pre=pp->next;
                    delete pp;
                    return pre;
                }
            }
            //有k个的情况
            
            //修改p[l...r]的指针的方向
            p1=pl;
            p2=pl->next;
            while(p1!=pr){
                pt=p2->next;
                p2->next=p1;
                p1=p2;
                p2=pt;
            }
            
            
            //把链表重新相连
            pl->next=p2;//最后p2代表的就是原来pr->next
            pre->next=pr;
            pre=pl;
        }
    }
};

转载于:https://www.cnblogs.com/ximelon/p/10834099.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值