0

0

c++中如何实现双向链表_c++双向链表实现方式

尼克

尼克

发布时间:2025-09-27 21:32:02

|

627人浏览过

|

来源于php中文网

原创

答案:C++实现双向链表需定义含data、next、prev的节点结构,并用类封装head和tail指针及操作方法,支持push_back、push_front、remove、正反向遍历等操作,通过维护前后指针实现高效插入删除,示例代码展示了基本操作与使用场景。

c++中如何实现双向链表_c++双向链表实现方式

在C++中实现双向链表,核心是定义一个节点结构体(或类),其中包含数据域和两个指针:一个指向下一个节点(next),另一个指向前一个节点(prev)。然后通过类封装链表的操作,如插入、删除、查找和遍历等。

定义双向链表节点和类

每个节点保存数据,并有两个指针分别连接前后节点。使用类来管理整个链表的头尾指针和操作方法。

  • 节点结构包含 data、next 和 prev 指针
  • 链表类维护 head 和 tail 指针,也可只用 head 实现,但维护 tail 可提升尾部操作效率

示例代码:

#include 
using namespace std;

// 定义节点结构 struct ListNode { int data; ListNode next; ListNode prev;

ListNode(int val) : data(val), next(nullptr), prev(nullptr) {}

};

立即学习C++免费学习笔记(深入)”;

BgSub
BgSub

免费的AI图片背景去除工具

下载

// 双向链表类 class DoublyLinkedList { private: ListNode head; ListNode tail;

public: DoublyLinkedList() : head(nullptr), tail(nullptr) {}

// 在链表末尾插入节点
void push_back(int val) {
    ListNode* newNode = new ListNode(val);
    if (!head) {
        head = tail = newNode;
    } else {
        tail->next = newNode;
        newNode->prev = tail;
        tail = newNode;
    }
}

// 在链表头部插入节点
void push_front(int val) {
    ListNode* newNode = new ListNode(val);
    if (!head) {
        head = tail = newNode;
    } else {
        newNode->next = head;
        head->prev = newNode;
        head = newNode;
    }
}

// 删除指定值的节点
bool remove(int val) {
    ListNode* curr = head;
    while (curr) {
        if (curr->data == val) {
            if (curr->prev) {
                curr->prev->next = curr->next;
            } else {
                head = curr->next;  // 当前是头节点
            }

            if (curr->next) {
                curr->next->prev = curr->prev;
            } else {
                tail = curr->prev;  // 当前是尾节点
            }

            delete curr;
            return true;
        }
        curr = curr->next;
    }
    return false;  // 未找到
}

// 打印链表(正向)
void print_forward() {
    ListNode* curr = head;
    while (curr) {
        cout zuojiankuohaophpcnzuojiankuohaophpcn curr-youjiankuohaophpcndata zuojiankuohaophpcnzuojiankuohaophpcn " ";
        curr = curr-youjiankuohaophpcnnext;
    }
    cout zuojiankuohaophpcnzuojiankuohaophpcn endl;
}

// 打印链表(反向)
void print_backward() {
    ListNode* curr = tail;
    while (curr) {
        cout zuojiankuohaophpcnzuojiankuohaophpcn curr-youjiankuohaophpcndata zuojiankuohaophpcnzuojiankuohaophpcn " ";
        curr = curr-youjiankuohaophpcnprev;
    }
    cout zuojiankuohaophpcnzuojiankuohaophpcn endl;
}

// 析构函数:释放所有节点内存
~DoublyLinkedList() {
    ListNode* curr = head;
    while (curr) {
        ListNode* next = curr->next;
        delete curr;
        curr = next;
    }
}

};

立即学习C++免费学习笔记(深入)”;

基本操作说明

上述实现包含了常用操作,理解其逻辑有助于掌握双向链表的本质。

    插入操作:
  • push_back 在尾部添加,需更新 tail 指针
  • push_front 在头部添加,需更新 head 指针
  • 删除操作:

  • 需处理四种情况:唯一节点、头节点、尾节点、中间节点
  • 注意指针判空,避免访问非法内存
  • 遍历方向:

  • 从 head 开始 next 遍历为正向
  • 从 tail 开始 prev 遍历为反向

使用示例

测试上面的双向链表实现:

int main() {
    DoublyLinkedList dll;
    dll.push_back(1);
    dll.push_back(2);
    dll.push_front(0);
    dll.print_forward();   // 输出: 0 1 2
    dll.print_backward();  // 输出: 2 1 0
dll.remove(1);
dll.print_forward();   // 输出: 0 2

return 0;

}

基本上就这些。双向链表比单向链表更灵活,支持前后双向遍历和高效地在任意位置插入删除,但每个节点多一个指针开销。实际开发中可根据需求选择是否需要维护 tail 指针,以及是否加入 size 计数器等优化。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

220

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

190

2025.07.04

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

469

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

13

2025.12.06

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

70

2026.01.23

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

72

2026.01.23

yy漫画官方登录入口地址合集
yy漫画官方登录入口地址合集

本专题整合了yy漫画入口相关合集,阅读专题下面的文章了解更多详细内容。

297

2026.01.23

漫蛙最新入口地址汇总2026
漫蛙最新入口地址汇总2026

本专题整合了漫蛙最新入口地址大全,阅读专题下面的文章了解更多详细内容。

469

2026.01.23

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

17

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7.6万人学习

C 教程
C 教程

共75课时 | 4.2万人学习

C++教程
C++教程

共115课时 | 13.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号