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++免费学习笔记(深入)”;

玫瑰克隆工具
玫瑰克隆工具

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 计数器等优化。

相关专题

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

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

195

2025.06.09

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

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

187

2025.07.04

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

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

464

2024.01.03

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

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

12

2025.12.06

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

1

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

5

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

5

2026.01.13

PHP缓存策略教程大全
PHP缓存策略教程大全

本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

热门下载

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

精品课程

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

共94课时 | 6.6万人学习

C 教程
C 教程

共75课时 | 4万人学习

C++教程
C++教程

共115课时 | 12.1万人学习

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

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