题解 | #链表中的节点每k个一组翻转#

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

https://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e

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

#include <iterator>
class Solution {
public:
    /**
     * 
     * @param head ListNode类 
     * @param k int整型 
     * @return ListNode类
     */
    void Reverse(ListNode* ps_,ListNode* pe_)
    {
        if(ps_==pe_)
        {
            return;
        }
        else 
        {
            ListNode* t1,* t2,*temp;
            t1=ps_;
            t2=t1->next;
            while(t2!=pe_)
            {
                temp=t2->next;
                t2->next=t1;

                t1=t2;
                t2=temp;
            }
            if(t2==pe_)
            {
                t2->next=t1;
            }
        }
    }

    ListNode* reverseKGroup(ListNode* head, int k) {
        // write code here
        if(head==nullptr)
        {
            return nullptr;
        }


        ListNode* newNode=new ListNode(*head);
        newNode->next=head;


        ListNode* ps=newNode;
        ListNode* pe=ps;


        ListNode* ps_=ps->next;
        ListNode* pe_=ps_;//pe_到ps_为需要交换的区间
        int i=1;
        while(pe!=nullptr)
        {
            while(i<k&&pe_!=nullptr)//移动到须要交换的位置
            {
                pe_=pe_->next;
                ++i;
            }
            if(i==k&&pe_!=nullptr)//如果移动成功
            {
                pe=pe_->next;
                Reverse(ps_,pe_);//实现反转连接
                ps_->next=pe;
                ps->next=pe_;


                //恢复为一般状态
                i=1;
                ps=ps_;
                ps_=pe;
                pe_=ps_;
                pe=ps;

            }
            if(pe_==nullptr)//如果到达末尾数量仍然不足
            {
                break;
            }

        }
        return newNode->next;
    }
};

对于一般情况:

......x->a->b->.....->c->y.....

如果逆置要a,b,c可以设置函数 void Reverse(ListNode* ps_,ListNode* pe_)

输入时ps_指向a,pe_指向c

执行结束后

<?....a<-b-<-....<-c(<?....表示不关心指向)

此时需要将x与c相连接,a与y相连接 ,为了防置结点丢失,在执行 Reverse(ListNode* ps_,ListNode* pe_)前应该设置ps,pe,分别指向x,y;

设置ps_=ps->next; pe_=ps_(因为要交换的结点至少为1),调用Reverse(ps_,pe_)

再连接即可。

注意:1.连接完成后需要将ps_,pe_,ps,pe置于一般问题状态

2.注意在寻找区间时如果pe_==nullptr时,表明数量不足k个,由题意应该不进行操作(结束程序)

总结:链表的调整改变结点的指向,指向结点的指针本身是不变的,pe指向结点a,无论链表做了什么调整,pe始终指向a

全部评论

相关推荐

头像
11-09 12:17
清华大学 C++
out11Man:小丑罢了,不用理会
点赞 评论 收藏
分享
沉淀一会:1.同学你面试评价不错,概率很大,请耐心等待; 2.你的排名比较靠前,不要担心,耐心等待; 3.问题不大,正在审批,不要着急签其他公司,等等我们! 4.预计9月中下旬,安心过节; 5.下周会有结果,请耐心等待下; 6.可能国庆节前后,一有结果我马上通知你; 7.预计10月中旬,再坚持一下; 8.正在走流程,就这两天了; 9.同学,结果我也不知道,你如果查到了也告诉我一声; 10.同学你出线不明朗,建议签其他公司保底! 11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务