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

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

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

2022.08.05算法第3题链表中的节点每k个一组翻转
链表按照k个一组进行反转,这道题有多种解法,递归也好理解,但是代码可能不太好写。
本文采用调用反转链表函数,分区段进行反转,也能达到相应的目的。
首先,需要创建反转链表的子函数,用于主函数中进行调用
    ListNode* reverse(ListNode* head)
    {
        ListNode* pre=NULL;
        ListNode* cur=head;
        ListNode* temp=NULL;
        while(cur!=NULL)
        {
            temp=cur->next;
            cur->next=pre;
            pre=cur;
            cur=temp;
        }
        return pre;
    }
然后创建初始值,pre,start,end,temp;

第一次循环pre指向dummy
start指向组内的起始位置,end指向起始位置,
采用for循环将end指向组内的最后一个节点,并且判断当前组是否满足K个数据的要求。
for(int i=1;i<k&&end!=NULL;i++)
  end=end->next;
if(end==NULL)
   break;
经过循环此时start指向组内首个节点,end指向组内最后一个节点;

此时需要将end后的节点保存起来,temp(next)指向end后一个节点。
注意此时需要将end指向节点的next赋值为NULL,确保调用函数正确执行。
同时需要保存反转之后的头尾节点,
end=start;
start=reverse(start);


反转之后start指向原来的尾节点,end指向原来的头节点(此处start和end写反了)
之后将结点的指向修改正确,
end->next=temp;
pre->next=start;
之后更新各个变量的指向,此时要从前往后更新
pre=end;
start=temp;
end=start;
之后进行循环,直到end为NULL


#算法题#
全部评论

相关推荐

11-08 10:39
门头沟学院 C++
点赞 评论 收藏
分享
过往烟沉:我说什么来着,java就业面就是广!
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务