双向链表
特点
- 每一个节点除了数据域,有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)
{}
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);
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 = p->next_;
}
Node *node = new Node(val);
node->pre_ = p;
p->next_ = node;
}
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_;
if (p->next_ != nullptr)
{
p->next_->pre_ = p->pre_;
}
Node *next = p->next_;
delete p;
p = next;
}
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;
}