浅谈【数据结构】链表之双链表

目录

1、删除结点

2、双向链表

2.1增加结点

2.2删除结点


谢谢帅气美丽且优秀的你看完我的文章还要点赞、收藏加关注

没错,说的就是你,不用再怀疑!!!

希望我的文章内容能对你有帮助,一起努力吧!!!


本文主要以图示+代码为主  

数据结构最多的操作:增删改查

1、删除结点

但是我们发现单链表存在一个弊端:不能回溯(没法直接回到前一个结点)

有木有方法可以解决这个问题?

双向链表它可以解决单向链表只有一个指针指向下一个结点没法回溯的这么一个问题。

2、双向链表

双向链表它包含数据域和指针域(但是指针域相对单链表而言多出了一个指针:prev指针)

struct node
{
// 数据域
    ElementType data;
// 指针域
    struct node *prev; // 前指针
    struct node *next; // 后指针
};

2.1增加结点

图示:

头插:

尾插:

中间位置插入:

2.2删除结点

图示:删除头结点  删除中间节点 删除尾结点    图示示例+代码示例

***双链表示例***

/*
    双向链表
*/
#include <iostream>
// 换一种方式来实现双向链表:对象

template <typename DataType>
class ddl
{
public:
    ddl(); // 创建一个双向链表
    ~ddl(); // 销毁一个双向链表

    // 增删改查

    // 增加
    bool addNode(DataType d)
    {
        // 中、头、尾插入...

        // 尾插法
        // 如果链表是空的那么需要将新节点作为第一个结点增加
        if(firstNode == nullptr)
        {
            firstNode = new struct node;
            firstNode->data = d;
            firstNode->next = nullptr;
            firstNode->prev = nullptr;
        }
        else
        {
            // 先找尾结点
            struct node *tail_ptr = firstNode;
            while(tail_ptr->next)tail_ptr = tail_ptr->next;

            // 进行插入
            struct node *newNode = new struct node;
            newNode->data = d;
            newNode->next = nullptr;
            newNode->prev = nullptr;
            tail_ptr->next = newNode;
            newNode->prev  = tail_ptr;
        }
        length ++;
        return true;
    }

    // 删除
    bool delNode(DataType d)
    {
        if(length == 0)
            return false;
        
        // 查找要删除的结点
        struct node *delNode_ptr = firstNode;
        while(delNode_ptr)
        {
            // 进行数据比较,是否尾需要删除的结点
            if(delNode_ptr->data == d)
            {
                // 进行删除
                // 需要判断一下是不是只有一个元素
                if(length == 1)
                {
                    // 断开当前结点的指向,让
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值