双向链表
特点
- 每一个节点除了数据域,有next指针域指向下一个节点,pre指向前一个节点;
- 头节点的pre是空(双向循环链表的头结点的Pre指向最后一个节点),末尾节点的next是NULL(双向循环链表的末尾节点的Pre指向头结点).
接口实现
#include <iostream>
#include <time.h>
using namespace std;
struct Node
{
Node(int data = 0)
:data_(data)
, next_(nullptr)
, pre_(nullptr)
{} // Module 库的代码风格
int data_;
Node *pre_;
Node *next_;
};
class DoubleLink
{
public:
DoubleLink()
{
head_ = new Node();
}
~DoubleLink()
{
Node *p = head_;
while (p != nullptr)
{
head_ = head_->next_;
delete p;
p = head_;
}
}
public:
// 头插
void InsertHead(int val)
{
Node *p = new Node(val);
// 记住修的时候先改新节点的前后,再次改head后边的节点,最后改head
p->next_ = head_->next_;
p->pre_ = head_;
if (head_->next_ != nullptr)
{
head_->next_->pre_ = p;
}
head_->next_ = p;
}
// 尾插法
void InsertTail(int val)
{
Node *p = head_;
while (p->next_ != nullptr) // 尾插时候,是p->next 判断
{
p = p->next_;
}
//
Node *node = new Node(val);
node->pre_ = p;
p->next_ = node;
}
// show
void Show() const
{
Node *p = head_->next_;
while (p != nullptr)
{
cout << p->data_ << " ";
p = p->next_;
}
cout << endl;
}
// 删除节点
void RemoveAll(int val)
{
Node *p = head_->next_;
while (p != nullptr)
{
if ( val == p->data_)
{
p->pre_->next_ = p->next_;// p前指向p后
if (p->next_ != nullptr)
{
p->next_->pre_ = p->pre_;
}
Node *next = p->next_;
delete p;
p = next;
// return;
}
else
{
p = p->next_;
}
}
}
// 查询
bool Find(int val)
{
Node *p = head_->next_;
while (p != nullptr)
{
if (p->data_ == val)
{
return true;
}
else
{
p = p->next_;
}
}
}
private:
Node *head_;
};
int main()
{
DoubleLink dlink;
dlink.InsertTail(1);
dlink.InsertTail(2);
dlink.InsertTail(3);
dlink.InsertTail(4);
dlink.InsertTail(5);
dlink.Show();
dlink.InsertHead(6);
dlink.Show();
dlink.RemoveAll(2);
dlink.Show();
dlink.RemoveAll(5);
dlink.Show();
system("pause");
return 0;
}
本文含有隐藏内容,请 开通VIP 后查看