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

c++ 链表知识汇总

文章目录

  • 链表结点的创建方式
      • 1. ListNode ans;:栈上创建(局部变量)
      • 2. ListNode* ans = new ListNode(0);:堆上创建(动态分配)
      • 总结对比表
      • 链表场景中的选择

链表结点的创建方式

在 C++ 中,ListNode ans;ListNode* ans = new ListNode(0); 是两种创建链表节点的方式,核心区别在于内存分配方式生命周期管理,这直接影响它们的使用场景和行为:

1. ListNode ans;:栈上创建(局部变量)

  • 内存分配:节点 ans 被分配在栈内存中,由编译器自动管理内存。
  • 生命周期:仅在当前作用域内有效(如函数内、循环体或 if 块内)。当程序执行离开该作用域时,节点会被自动销毁,内存被释放。
  • 访问方式:通过 . 运算符访问成员(如 ans.valans.next)。
  • 局限性
    • 离开作用域后,节点内存被释放,若之前保存了指向该节点的指针(如 p = &ans),会变成野指针(访问已释放内存,导致未定义行为)。
    • 无法在函数中作为返回值有效传递(返回后节点已销毁)。

2. ListNode* ans = new ListNode(0);:堆上创建(动态分配)

  • 内存分配:通过 new 关键字在堆内存中手动分配节点,内存不会随作用域结束而自动释放。
  • 生命周期:直到显式调用 delete ans; 才会释放内存,或程序结束时由操作系统回收。
  • 访问方式:通过指针 ans 访问,使用 -> 运算符(如 ans->valans->next)。
  • 优势
    • 可以在函数间传递指针,即使创建节点的作用域结束,节点依然有效(只要未被 delete)。
    • 适合需要长期存在的对象(如链表节点,通常需要在函数返回后继续使用)。
  • 注意:若忘记 delete,会导致内存泄漏(堆内存未释放,持续占用资源)。

总结对比表

特性ListNode ans;(栈上)ListNode* ans = new ListNode(0);(堆上)
内存位置栈内存堆内存
生命周期作用域内有效,自动销毁手动 delete 前一直有效
访问方式. 运算符(如 ans.val-> 运算符(如 ans->val
适用场景临时使用,无需跨作用域传递需要跨作用域使用(如链表节点、返回值)
风险作用域结束后指针失效(野指针)忘记 delete 导致内存泄漏

链表场景中的选择

在链表操作(如合并、反转、两数相加)中,几乎总是使用 new 在堆上创建节点,原因是:
链表节点需要在函数返回后继续存在(供调用者使用),而栈上的节点会随函数结束被销毁,导致返回的链表指针失效。

例如你之前代码中的 ListNode ans; 会导致后续 p->next = &tmp 指向已销毁的栈内存,而 new 创建的节点则能在函数返回后保持有效。

http://www.dtcms.com/a/311174.html

相关文章:

  • FreeRTOS源码分析一:task创建(RISCV架构)
  • 【Pytorch✨】LSTM 入门
  • 用 Qt 打造优雅的密码输入框:添加右侧眼睛图标切换显示
  • 云环境K8s集群WebSocket连接失败解决方案
  • 深入解析 <component :is> 在 Vue3 组合式中的使用与局限
  • 关于Web前端安全防御之点击劫持的原理及防御措施
  • Docker容器中文PDF生成解决方案
  • JavaScript特殊集合WeakMap 的使用及场景介绍
  • C++ lambda表达式与线程库
  • String boot 接入 azure云TTS
  • 20250802安装CP2102N的驱动程序(适配飞凌的OK3576-C)
  • 如何在Ubuntu上部署excalidraw
  • Seal Report:一款免费开源的报表工具
  • 使用 BERT 的 NSP 实现语义感知切片 —— 提升 RAG 系统的检索质量
  • 计算机网络:什么是任播
  • 【计算机网络】Socket网络编程
  • 从零开始构建AI Agent评估体系:12种LangSmith评估方法详解
  • QUdpSocket 详解:从协议基础、通信模式、数据传输特点、应用场景、调用方式到实战应用全面解析
  • Linux网络编程【基于UDP网络通信的字典翻译服务】
  • M|银翼杀手
  • Web 开发 10
  • K8s+Nginx-ingress+Websocket基础知识理解
  • 系统思考:超越线性分析
  • python创建一个excel文件
  • MyBatis 批量操作 XML 实现方式
  • 【BTC】挖矿难度调整
  • Vue 详情模块 3
  • Matplotlib - Python图表可视化利器
  • Vue3核心语法进阶(computed与监听)
  • 除数博弈(动态规划)