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

C++数据结构(链表和list)

链表的定义

链表:用链式存储实现的线性表。

链式存储:在内存中,不仅存储当前元素的信息,还存储前继或后继结点的地址。通过地址实现元素与元素之间的关系。

单链表、带头链表(头结点链表)、双向链表、循环链表的基础定义

1. 单链表(Singly Linked List)

定义:每个节点包含数据域和一个指向后继节点的指针,最后一个节点的指针为nullptr特点:只能从表头向表尾遍历,插入 / 删除需修改前驱节点的指针。

// 节点结构
template <typename T>
struct SinglyNode {T data;               // 数据域SinglyNode<T>* next;  // 指向后继节点的指针// 构造函数SinglyNode(const T& val) : data(val), next(nullptr) {}
};// 单链表类(不带头节点)
template <typename T>
class SinglyLinkedList {
private:SinglyNode<T>* head;  // 头指针(指向第一个节点)
public:SinglyLinkedList() : head(nullptr) {}// 其他成员函数(插入、删除、遍历等)
};

2. 带头链表(头结点链表,Singly Linked List with Head Node)

定义:在单链表的基础上增加一个头结点(不存储实际数据),头指针指向头结点,头结点的next指向第一个实际节点。特点:统一空表和非空表的操作逻辑(无需特殊处理头指针),简化插入 / 删除代码。

// 节点结构(同单链表)
template <typename T>
struct HeadNode {T data;               // 头结点可闲置或存长度等信息HeadNode<T>* next;HeadNode() : next(nullptr) {}  // 头结点默认构造
};// 带头链表类
template <typename T>
class HeadLinkedList {
private:HeadNode<T>* head;  // 头指针(指向头结点)
public:HeadLinkedList() {head = new HeadNode<T>();  // 初始化头结点}// 其他成员函数
};

3. 双向链表(Doubly Linked List)

定义:每个节点包含数据域、指向后继节点的指针(next)和指向前驱节点的指针(prev)。特点:可双向遍历,插入 / 删除时需同时修改前驱和后继的指针,但操作更灵活。

// 节点结构
template <typename T>
struct DoublyNode {T data;                // 数据域DoublyNode<T>* prev;   // 指向前驱节点DoublyNode<T>* next;   // 指向后继节点DoublyNode(const T& val) : data(val), prev(nullptr), next(nullptr) {}
};// 双向链表类(可带头结点,此处示例带头结点)
template <typename T>
class DoublyLinkedList {
private:DoublyNode<T>* head;  // 头指针(指向头结点)
public:DoublyLinkedList() {head = new DoublyNode<T>(T());  // 头结点head->prev = head->next = head;  // 若为循环双向链表则指向自身}// 其他成员函数
};

4. 循环链表(Circular Linked List)

定义:最后一个节点的指针不指向nullptr,而是指向表头(单循环)或头结点(带头循环),形成闭环。双向循环链表中,头结点的prev指向尾节点。特点:可从任意节点遍历整个链表,适合实现环形队列等场景。

(1)单循环链表(带头结点)

template <typename T>
struct CircSinglyNode {T data;CircSinglyNode<T>* next;CircSinglyNode(const T& val) : data(val), next(nullptr) {}
};template <typename T>
class CircSinglyLinkedList {
private:CircSinglyNode<T>* head;  // 头结点
public:CircSinglyLinkedList() {head = new CircSinglyNode<T>(T());head->next = head;  // 头结点next指向自身(空表)}// 插入节点后,尾节点next需指向head
};

(2)双向循环链表(带头结点)

// 节点结构同双向链表的DoublyNode
template <typename T>
class CircDoublyLinkedList {
private:DoublyNode<T>* head;
public:CircDoublyLinkedList() {head = new DoublyNode<T>(T());head->prev = head;  // 头结点prev指向自身head->next = head;  // 头结点next指向自身}// 尾节点next指向head,head->prev指向尾节点
};

核心区别总结

类型指针方向尾节点指针核心优势
单链表单向(next)nullptr结构简单,内存开销小
带头链表单向(next)nullptr统一操作逻辑,简化代码
双向链表双向(prev+next)nullptr双向遍历,插入删除更灵活
循环链表单向 / 双向指向表头 / 头结点环形遍历,适合循环场景

单链表的功能实现

定义

头插

遍历

按值查找

删除任意位置之后的元素

双向链表

头插

按值查找

任意位置之后插入元素

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

相关文章:

  • 【Maven】mac安装maven
  • 有哪些网站能够免费找到素材wordpress 制作小工具栏
  • 深入剖析:仓颉语言的性能优化核心技术
  • .Net Core基于EasyCore.EventBus实现事件总线
  • 公司怎么做网站推广郑州包装设计公司
  • 阿里云服务器上构建基于PoS的以太坊2.0私有链
  • 如何把网站推广出编程代码怎么学
  • C++ 单调栈
  • 电商网站开发 上海wordpress 登陆 没反应
  • 服务器网站备案wordpress三道杠菜单
  • mysql upsert 用法(批量保存或更新)
  • 海康相机与机器人标定
  • 十年后,AI会赋予工业怎样的力量?
  • 西安市建设协会网站高级搜索入口
  • 东莞个人网站推广建设做中东市场哪个网站合适
  • Spring Boot 3 整合 LiteFlow:轻量级流程编排框架学习
  • Rust:WebSocket支持的实现
  • 代刷开通建设网站Wordpress怎么添加购买页面
  • 做网站几个步骤网址推荐你会感谢我的
  • 黑马商城day7-消息可靠性
  • wpsapi
  • Postman实现jwt发送请求
  • 网站正在备案什么是网络营销 职能是什么
  • 【AI】Prompt 提示词工程
  • R语言高效数据处理-3个自定义函数笔记
  • 石家庄做网站备案有哪些公司品牌广告公司网站建设
  • 纯静态网站怎么入侵报告王妃
  • 郑州微盟网站建设公司网站建设的目的和目标
  • 仓颉中的字符串常用方法:语义一致性与高性能的设计哲学
  • 新MCU开发板快速上手指南:从开箱到精通