当前位置: 首页 > article >正文

深入解析双向链表与反转算法

一、双向链表核心概念单向链表只能从头往后走不能回头。双向链表每个节点有前驱指针 后继指针可以从头往后、从尾往前双向遍历任意节点删除、查找更方便结构稍微复杂一点但实用性更强节点结构数据域 前驱 prev 指针 后继 next 指针二、双向链表节点定义struct DListNode { int val; DListNode* prev; DListNode* next; DListNode(int x) : val(x), prev(nullptr), next(nullptr) {} };三、双向链表基础操作实现1. 尾插法创建双向链表DListNode* createDList() { DListNode* dummy new DListNode(0); DListNode* cur dummy; cur-next new DListNode(10); cur-next-prev cur; cur cur-next; cur-next new DListNode(20); cur-next-prev cur; cur cur-next; cur-next new DListNode(30); cur-next-prev cur; return dummy-next; }2. 正向、反向遍历// 正向遍历 void printForward(DListNode* head) { DListNode* cur head; while(cur) { cout cur-val ; cur cur-next; } cout endl; } // 反向遍历 void printBackward(DListNode* tail) { DListNode* cur tail; while(cur) { cout cur-val ; cur cur-prev; } cout endl; }3. 头部插入节点DListNode* addHead(DListNode* head, int val) { DListNode* newNode new DListNode(val); newNode-next head; if(head) head-prev newNode; return newNode; }4. 删除指定节点双向链表删除不用从头遍历定位前一个节点直接自删void delNode(DListNode* node) { DListNode* p node-prev; DListNode* n node-next; p-next n; if(n) n-prev p; delete node; }四、算法重点单链表反转必考万能模板迭代版笔试首选、无递归栈溢出风险ListNode* reverseList(ListNode* head) { ListNode* pre nullptr; ListNode* cur head; ListNode* next nullptr; while(cur ! nullptr) { // 保存下一个 next cur-next; // 反转指向 cur-next pre; // 双指针后移 pre cur; cur next; } return pre; }必背口诀存下一个 → 改指向 → 双指针同步后移递归版面试常问思路ListNode* reverseListRecur(ListNode* head) { if(head nullptr || head-next nullptr) return head; ListNode* newHead reverseListRecur(head-next); head-next-next head; head-next nullptr; return newHead; }五、完整可运行测试代码#include iostream using namespace std; // 双向链表节点 struct DListNode { int val; DListNode* prev; DListNode* next; DListNode(int x) : val(x), prev(nullptr), next(nullptr) {} }; // 单向链表节点用于反转 struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(nullptr) {} }; // 省略上面写的所有函数直接main测试 int main() { // 双向链表测试 DListNode* dHead createDList(); cout 双向链表正向; printForward(dHead); // 单链表反转测试 ListNode* n1 new ListNode(1); ListNode* n2 new ListNode(2); ListNode* n3 new ListNode(3); n1-next n2; n2-next n3; ListNode* res reverseList(n1); cout 链表反转后; while(res) { cout res-val ; res res-next; } return 0; }六、今日笔试面试考点双向链表可双向遍历删除节点效率比单链表高双向链表操作务必维护prev 和 next两个指针防止断链链表反转迭代版优先背诵工作刷题都用它递归反转理解思路即可大数据量容易栈溢出链表反转是笔试原题高频考点必须默写熟练七、今日总结双向链表多一个前驱指针支持双向遍历优势删除、反向遍历更方便链表反转掌握迭代万能模板直接套所有题链表反转是后续回文链表、k 个一组反转的基础

相关文章:

深入解析双向链表与反转算法

一、双向链表核心概念单向链表:只能从头往后走,不能回头。双向链表:每个节点有前驱指针 后继指针可以从头往后、从尾往前双向遍历任意节点删除、查找更方便结构稍微复杂一点,但实用性更强节点结构:数据域 前驱 prev …...

为内部知识问答系统集成 Taotoken 提供多模型后备支持

为内部知识问答系统集成 Taotoken 提供多模型后备支持 在企业内部构建智能问答系统时,一个核心挑战是如何平衡回答质量与系统可靠性。单一模型供应商的 API 可能因服务波动、配额耗尽或网络问题而暂时不可用,导致整个问答服务中断。直接对接多家供应商&…...

Fast-GitHub:3分钟解锁GitHub全速访问的终极指南

Fast-GitHub:3分钟解锁GitHub全速访问的终极指南 【免费下载链接】Fast-GitHub 国内Github下载很慢,用上了这个插件后,下载速度嗖嗖嗖的~! 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 对于国内开发者而言&a…...

如何快速下载Qobuz无损音乐:C开源工具完整指南

如何快速下载Qobuz无损音乐:C#开源工具完整指南 【免费下载链接】QobuzDownloaderX-MOD Downloads streams directly from Qobuz. Experimental refactoring of QobuzDownloaderX by AiiR 项目地址: https://gitcode.com/gh_mirrors/qo/QobuzDownloaderX-MOD …...

如何用AD8232传感器30分钟搭建专业级开源心电监测系统:完整指南

如何用AD8232传感器30分钟搭建专业级开源心电监测系统:完整指南 【免费下载链接】AD8232_Heart_Rate_Monitor AD8232 Heart Rate Monitor 项目地址: https://gitcode.com/gh_mirrors/ad/AD8232_Heart_Rate_Monitor 想要构建自己的专业级心电监测设备却不知从…...

容器化FreeIPA实战:快速部署企业级统一身份认证平台

1. 项目概述:容器化身份管理的核心利器在任何一个稍具规模的技术团队里,身份认证和集中化管理都是个绕不开的“基建”话题。想象一下,每次有新同事入职,你都得在十几台服务器上手动创建用户、设置权限;或者某个同事离职…...

创业个体2026 AI数字人软件选型:10 款轻量化工具易上手省成本

摘要如果你正考虑用AI数字人开启副业或为线下生意引流,市面上几十款工具鱼龙混杂,选错一个就是几百上千元的试错成本。本文抛开厂家营销话术,用真实的评测标准实测了10款轻量化AI数字人软件,从功能完整性、上手难度、成本控制三个…...

MacBook Air M4到手后,我第一时间用它跑了Llama 3.1:本地大模型体验报告

MacBook Air M4实战Llama 3.1:移动端大模型体验全记录 当这台午夜色的MacBook Air M4从包装盒滑出的瞬间,我就知道该给本地大模型来个"压力测试"了。作为每天在咖啡厅和地铁间穿梭的开发者,真正关心的从来不是发布会PPT上的参数对比…...

换新手机后,微信聊天记录怎么无缝‘搬家’?保姆级避坑指南(附熄屏、网络设置)

换新手机后,微信聊天记录无缝迁移全攻略:从防坑设置到完整验证 刚拿到新手机的兴奋感,往往在想到要迁移微信聊天记录时瞬间降温——那些工作群的重要文件、家人朋友的珍贵对话、收藏多年的表情包,一旦丢失就再也找不回来。作为一个…...

Dhizuku终极指南:5步实现Android DeviceOwner权限安全共享

Dhizuku终极指南:5步实现Android DeviceOwner权限安全共享 【免费下载链接】Dhizuku A tool that can share DeviceOwner permissions to other application. 项目地址: https://gitcode.com/gh_mirrors/dh/Dhizuku Dhizuku是一款创新的Android工具&#xff…...

Canaan K510 CRB开发套件:RISC-V AI边缘计算实战指南

1. Canaan K510 CRB开发套件深度解析作为RISC-V生态中首款面向AI应用的开发平台,Canaan K510 CRB开发套件在硬件设计上展现了独特的工程考量。其核心采用K510 SoC芯片,这款三核异构处理器包含两个800MHz的64位RISC-V CPU核心和一个专用DSP核心&#xff0…...

D2RML终极指南:暗黑破坏神2重制版多开神器,告别繁琐登录!

D2RML终极指南:暗黑破坏神2重制版多开神器,告别繁琐登录! 【免费下载链接】D2RML Diablo 2 Resurrected Multilauncher 项目地址: https://gitcode.com/gh_mirrors/d2/D2RML 还在为《暗黑破坏神2:重制版》多账户切换而烦恼…...

【Ultralytics】「6」整体架构设计:从引擎层到模型层的分层解耦

Ultralytics YOLO 框架采用四层分治架构,将系统自顶向下划分为 API 门面层、引擎协议层、模型特化层和神经网络构建层。每一层仅依赖其直接下层,通过属性多态(task_map)和延迟加载(__getattr__)实现层间解耦…...

3步完成M9A小助手配置:重返未来1999终极自动化指南

3步完成M9A小助手配置:重返未来1999终极自动化指南 【免费下载链接】M9A 重返未来:1999 小助手 | Assistant For Reverse: 1999 项目地址: https://gitcode.com/gh_mirrors/m9/M9A M9A是专为《重返未来:1999》玩家设计的智能自动化小助…...

Calibre豆瓣插件终极指南:3分钟快速获取中文图书元数据

Calibre豆瓣插件终极指南:3分钟快速获取中文图书元数据 【免费下载链接】calibre-douban Calibre new douban metadata source plugin. Douban no longer provides book APIs to the public, so it can only use web crawling to obtain data. This is a calibre Do…...

革命性MTP内核架构:OpenMTP如何重新定义macOS与Android文件传输标准

革命性MTP内核架构:OpenMTP如何重新定义macOS与Android文件传输标准 【免费下载链接】openmtp OpenMTP - Advanced Android File Transfer Application for macOS 项目地址: https://gitcode.com/gh_mirrors/op/openmtp 在跨平台文件传输领域,mac…...

3步掌握OpenMTP:让Mac与Android文件传输变得如此简单

3步掌握OpenMTP:让Mac与Android文件传输变得如此简单 【免费下载链接】openmtp OpenMTP - Advanced Android File Transfer Application for macOS 项目地址: https://gitcode.com/gh_mirrors/op/openmtp 还在为Mac与Android设备间的文件传输烦恼吗&#xff…...

AI视频总结怎么做?多模态AI从音视频到结构化知识的实践

摘要: 视频总结是内容从业者的刚需——但手动做视频总结太耗时间。本文探讨多模态AI技术(语音视觉文本)如何实现自动化视频总结,分析当前主流方案,并分享如何利用多模态能力高效完成视频转笔记、构建个人知识库。 一、…...

Calibre中文路径终极解决方案:3步告别拼音乱码,永久保留原文件名

Calibre中文路径终极解决方案:3步告别拼音乱码,永久保留原文件名 【免费下载链接】calibre-do-not-translate-my-path Switch my calibre library from ascii path to plain Unicode path. 将我的书库从拼音目录切换至非纯英文(中文&#xff…...

终极免费Switch模拟器Ryujinx:在PC上畅玩任天堂游戏的完整解决方案

终极免费Switch模拟器Ryujinx:在PC上畅玩任天堂游戏的完整解决方案 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx 想要在电脑上体验《塞尔达传说:旷野之息》的…...

如何3步零基础掌握缠论分析:通达信ChanlunX插件终极指南

如何3步零基础掌握缠论分析:通达信ChanlunX插件终极指南 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX 你是否曾经面对复杂的缠论分析感到无从下手?手动绘制笔段、识别中枢不仅耗…...

告别驱动烦恼:Win10/Win11下STM32CubeProgrammer与DFU驱动一键安装全攻略

告别驱动烦恼:Win10/Win11下STM32CubeProgrammer与DFU驱动一键安装全攻略 对于嵌入式开发者来说,STM32CubeProgrammer无疑是一个不可或缺的工具。然而,在Windows 10和Windows 11系统上安装这个软件时,很多用户都会遇到各种驱动兼容…...

告别纯命令行:给OpenDaylight控制器装个Web管理界面(DLUX Apps配置详解)

从命令行到可视化:OpenDaylight控制器DLUX Web界面深度配置指南 当你第一次成功启动OpenDaylight控制器时,面对那个漆黑的Karaf控制台,可能会感到一丝迷茫——这与想象中的"美观完善的可视化管理界面"相去甚远。别担心,…...

Python API 设计:从入门到精通

Python API 设计:从入门到精通 1. 技术分析 1.1 API 设计原则 原则描述重要性一致性统一的命名和参数顺序高简洁性最小化必要参数高可扩展性支持后续功能扩展高文档化完整的文档和示例中类型提示静态类型检查支持中 1.2 API 设计模式 模式适用场景示例命令查询分离清…...

告别‘驱动未加载’:用CMake重新编译Qt MySQL插件(Qt 5.15.2 + MySQL 8.0)

告别“驱动未加载”:CMake构建Qt MySQL插件全指南 Qt开发者在使用MySQL数据库时,经常会遇到"QSqlDatabase: QMYSQL driver not loaded"的报错。这个问题通常是由于Qt官方发布的二进制版本中未包含MySQL驱动插件所致。本文将详细介绍如何通过CM…...

构建拥有长期记忆与审批流程的QQ群AI智能体:OpenClaw NapCat插件实践

1. 项目概述:为QQ群聊注入一个“独立人格”如果你玩过AI聊天机器人,大概率体验过那种“一问一答”的模式:你发一条消息,它基于一个固定的提示词(prompt)生成回复,对话结束,上下文清空…...

为内部知识问答系统接入 Taotoken 提供多模型后备支持

为内部知识问答系统接入 Taotoken 提供多模型后备支持 1. 企业知识问答系统的稳定性挑战 在企业内部知识管理场景中,智能问答系统需要持续提供准确可靠的响应。传统单一模型接入方式存在明显局限:当主模型因流量高峰、服务波动或特定查询不适配时&…...

Freertos中Task状态信息和CPU占用率查看

1. 启用 “状态信息” 2. 启用专门定时器启用的定时器频率,需要超过Freertos时基10倍以上,比如Freertos的周期是1ms,则定时器的周期至少是1ms/10 100us.3. 更新函数//增加变量定义volatile long long FreeRTOSRunTimeTicks;//更新函数void configureTim…...

观察 Taotoken 账单明细如何实现项目成本的精准分摊

观察 Taotoken 账单明细如何实现项目成本的精准分摊 对于技术团队负责人或项目管理者而言,大模型 API 的调用成本管理是一个既重要又繁琐的课题。当多个项目、不同团队共享同一个模型服务池时,如何清晰地追溯每一笔花费的来源,并将其准确地分…...

从一道CTF题出发,手把手教你用Gopher协议玩转SSRF+SQL注入(附Python脚本)

从零构建Gopher协议攻击链:SSRF与SQL注入的深度实战指南 当你第一次在CTF比赛中遇到SSRF漏洞时,是否曾被Gopher协议的神秘面纱所困扰?作为内网渗透中最强大的协议之一,Gopher能够将SSRF的杀伤力提升到全新高度。本文将带你从协议原…...