LEETCODE解题笔记 —— 24.两两交换链表中的节点 & 25. K 个一组翻转链表

本文介绍了一种局部反转链表的方法,通过递归实现,并详细解释了关键步骤和注意事项,如处理前驱节点以避免丢失链表节点。

常作题,常更新。

 

这类题就是和反转链表有关,有两种思路,一种是维护几个指针顺着链表一个一个做处理。

这样效率比较高,但是确实比较繁琐。

另一个是用递归的思想来翻转链表,一层层递归下去,在函数出栈的时候让下一个节点的指针指向自己,因为使用了函数栈来记录每个节点的指针,所以代码实际上更简单了。

 

下面要要记录的是翻转链表的一个变体,即在链表中部分翻转链表。

下面是 25题的解,25题其实是24题的通用形式。

 

class Solution {
public:
    int count;
    ListNode* new_head;  //新的头
    ListNode* old_next;  // 第K+1个节点
    ListNode* pre;       //前驱
    bool partial_reverse(ListNode* p, int n)
    {
        if (p == nullptr) //没到数量就空了,说明不能翻转
        {
            return false;
        }
        if (n == count) //新的头部找到了,如果有前驱就把前驱的next指向它
        {
            old_next = p->next;
            new_head = p;
            //连上
            if (pre)
            {
                pre->next = new_head;
            }
            return true;
        }
        if (partial_reverse(p->next,n+1))  //递归到下一层,没问题就把下一层的next指向这层
        {
            p->next->next = p;
            if (n == 1)
            {
                p->next = old_next;   //新尾巴指向原来的后驱
                pre = p;              //新尾巴变成前驱,为下k个链表的反转做准备。
            }
            return true;
        }
        else
        {
            return false;
        }
    }
    ListNode* reverseKGroup(ListNode* head, int k) {
        if (k == 0 || k == 1) return head;
        count = k;
        new_head = nullptr;
        old_next = nullptr;
        pre = nullptr;
        ListNode* p = head;
        ListNode* res = head;
        int i = 0;
        while(partial_reverse(p,1))
        {
            if (i == 0)
            {
                res = new_head;
                i++;
            }
            p = old_next;
        }
        return res;
    }
};

注意 partial_reverse()函数,这个函数会反转部分链表,返回反转情况,如果剩下的节点不够k个,就会反转失败,返回false

利用class的特性,这个函数得以简化,和他相关的参数 :

count 是 k,子链表长度, new_head即反转后子链表的新头部,

old_next是子链表尾部的next,毕竟是在一个链表里做部分反转,所以还是要记下来,

pre是子链表的前驱

示意图如下:

pre —— sub list —— old_next

 

之前老是忘记处理pre这个节点,pre->next记录的是反转前的头节点,如果反转后不把pre->next指向新的头节点,会导致整条链表丢节点。

本项目构建于RASA开源架构之上,旨在实现一个具备多模态交互能力的智能对话系统。该系统的核心模块涵盖自然语言理解、语音转文本处理以及动态对话流程控制三个主要方面。 在自然语言理解层面,研究重点集中于增强连续对话中的用户目标判定效能,并运用深度神经网络技术提升关键信息提取的精确度。目标判定旨在解析用户话语背后的真实需求,从而生成恰当的反馈;信息提取则专注于从语音输入中析出具有特定意义的要素,例如个体名称、空间位置或时间节点等具体参数。深度神经网络的应用显著优化了这些功能的实现效果,相比经典算法,其能够解析更为复杂的语言结构,展现出更优的识别精度与更强的适应性。通过分层特征学习机制,这类模型可深入捕捉语言数据中隐含的语义关联。 语音转文本处理模块承担将音频信号转化为结构化文本的关键任务。该技术的持续演进大幅提高了人机语音交互的自然度与流畅性,使语音界面日益成为高效便捷的沟通渠道。 动态对话流程控制系统负责维持交互过程的连贯性与逻辑性,包括话轮转换、上下文关联维护以及基于情境的决策生成。该系统需具备处理各类非常规输入的能力,例如用户使用非规范达或对系统指引产生歧义的情况。 本系统适用于多种实际应用场景,如客户服务支持、个性化事务协助及智能教学辅导等。通过准确识别用户需求并提供对应信息或操作响应,系统能够创造连贯顺畅的交互体验。借助深度学习的自适应特性,系统还可持续优化语言模式理解能力,逐步完善对新兴达方式与用户偏好的适应机制。 在技术实施方面,RASA框架为系统开发提供了基础支撑。该框架专为构建对话式人工智能应用而设计,支持多语言环境并拥有活跃的技术社区。利用其内置工具集,开发者可高效实现复杂的对话逻辑设计与部署流程。 配套资料可能包含补充学习文档、实例分析报告或实践指导手册,有助于使用者深入掌握系统原理与应用方法。技术文档则详细说明了系统的安装步骤、参数配置及操作流程,确保用户能够顺利完成系统集成工作。项目主体代码及说明文件均存放于指定目录中,构成完整的解决方案体系。 总体而言,本项目整合了自然语言理解、语音信号处理与深度学习技术,致力于打造能够进行复杂对话管理、精准需求解析与高效信息提取的智能语音交互平台。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值