目录
谢谢帅气美丽且优秀的你看完我的文章还要点赞、收藏加关注
没错,说的就是你,不用再怀疑!!!
希望我的文章内容能对你有帮助,一起努力吧!!!
本文主要以图示+代码为主
数据结构最多的操作:增删改查
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)
{
// 断开当前结点的指向,让