单链表分段逆转分数 25

本文深入探讨了一个涉及链表反转的算法问题,重点在于如何处理不同子链的反转及拼接。通过详细分析和流程图说明,阐述了K个节点一组进行反转的策略,涉及关键变量如pre_last、first、pre、curr和rear的使用,以及每轮反转后的处理步骤。适合对链表操作和算法感兴趣的读者深入理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这个题目上耗费了一天多的时间,下决心搞明白。
题目的难点主要在于不同子链反转之后的拼接问题,这个问题处理起来细节比较多,看别人的代码很难明白,因此需要自己多画图。

分析时令count=9,K=4,即总结点数为9个,反转子链的长度为4,也就是需要有2个子链需要反转,每轮反转动作为3个,即(K-1)。

/*
首先定义变量:
    pre_last:前子链的最后一个结点
    first:本子链第一个结点,即反转后的最后一个结点
    pre:待反转结点的前一个结点
    cuur:待反转结点
    rear:待反转结点后一个结点,用于保存后续结点的地址
    */
void K_Reverse(List L, int K)
{
    int i, count = 0;
    List tmp, pre_last,first, pre, curr,rear;
    tmp = L->Next;
    while (tmp) {           //记录结点数量
        count++;
        tmp = tmp->Next;
    }
    pre_last = L;                       //首次进入反转前的处理

    for (i = 1; i <= count / K; i++)     //i为轮次,即需要反转的子链个数
    {
        pre = pre_last->Next;         //处理子链表前的初始化
        curr = pre->Next;
        first = pre;

        int j = K - 1;

        while (j--)
        {
            rear = curr->Next;      //记录待反转结点后的结点地址
            curr->Next = pre;   //反转
            pre = curr; curr = rear;        //后移
        }
        
        pre_last->Next = pre;   //每轮结束后的处理
        first->Next = curr;
        pre_last = first;
    }
   
}

整个过程流程图如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值