一、双向链表的实现
#include<iostream>
using namespace std;
//定义双向链表的节点类型
struct Node
{
Node(int data=0)
:data(data)
,next(nullptr)
,pre(nullptr)
{}
int data; //数据域
Node* next;//指向下一个节点
Node* pre;//指向前一个节点
};
//双向链表
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* s = new Node(val);
s->next = head->next;
s->pre = head;
if (head->next != nullptr) {
head->next->pre = s;
}
head->next = s;
}
//尾插法
void InsertTail(int val)
{
Node* p = head;
while (p->next!=nullptr)
{
p = p->next;
}
Node* s = new Node(val);
s->pre = p;
p->next = s;
}
//节点删除
void Remove(int val)
{
Node* p = head->next;
while (p != nullptr)
{
if (p->data == val)
{//删除p指向的节点
p->pre->next = p->next;
if (p->next != nullptr)
{
p->next->pre = p->pre;
}
delete p;
return;
}
else
{
p = p->next;
}
}
}
//删除所有值相同的节点
void RemoveAll(int val)
{
Node* p = head->next;
while (p != nullptr)
{
if (p->data == val)
{//删除p指向的节点
p->pre->next = p->next;
if (p->next != nullptr)
{
p->next->pre = p->pre;
}
Node* node = p->next;
delete p;
p = node;
}
else
{
p = p->next;
}
}
}
//节点搜索
bool Find(int val)
{
Node* p = head->next;
while (p != nullptr)
{
if (p->data == val)
{
return true;
}
}
return false;
}
//链表节点输出
void Show()
{
Node* p = head->next;
while (p != nullptr)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
private:
Node* head;
};
int main() {
DoubleLink dlink;
dlink.InsertHead(99);
dlink.InsertTail(10);
dlink.InsertTail(50);
dlink.InsertTail(18);
dlink.InsertTail(60);
dlink.InsertTail(18);
dlink.InsertTail(166);
dlink.Show();
dlink.InsertHead(99);
dlink.Show();
dlink.Remove(99);
dlink.Show();
dlink.RemoveAll(18);
dlink.Show();
return 0;
}
二、双向循环链表的实现
#include<iostream>
using namespace std;
//定义双向循环链表
struct Node
{
Node(int data=0)
:data(data)
,next(nullptr)
,pre(nullptr)
{}
int data;//数据域
Node* next;//指向下一个节点
Node* pre;//指向上一个节点
};
//双向循环链表
class DoubleCircleLink
{
public:
DoubleCircleLink()
{
head = new Node();
head->next = head;
head->pre = head;
}
~DoubleCircleLink()
{
Node* p = head->next;
while (p != head)
{
head->next = p->next;
p->next->pre = head;
delete p;
p = head->next;
}
delete head;
head = nullptr;
}
public:
//头插法 O(1)
void InsertHead(int val)
{
Node* s = new Node(val);
s->next = head->next;
s->pre = head;
head->next->pre = s;
head->next = s;
}
//尾插法 O(1)
void InsertTail(int val)
{
Node* p = head->pre;
Node* s = new Node(val);
s->pre = p;
p->next = s;
s->next = head;
head->pre = s;
}
//节点删除
void Remove(int val)
{
Node* p = head->next;
while (p != head)
{
if (p->data == val)
{
p->pre->next = p->next;
p->next->pre = p->pre;
delete p;
return;
}
else
{
p = p->next;
}
}
}
//节点搜索
bool Find(int val)
{
Node* p = head->next;
while (p != head)
{
if (p->data == val)
{
return true;
}
}
return false;
}
//链表节点输出
void Show()
{
Node* p = head->next;
while (p != head)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
private:
Node* head;
};
int main() {
DoubleCircleLink dlink;
dlink.InsertHead(99);
dlink.InsertTail(10);
dlink.InsertTail(50);
dlink.InsertTail(18);
dlink.InsertTail(60);
dlink.InsertTail(18);
dlink.InsertTail(166);
dlink.Show();
dlink.InsertHead(99);
dlink.Show();
dlink.Remove(99);
dlink.Show();
dlink.Show();
return 0;
}
总结
今天主要给大家介绍了双向链表和双向循环链表,与单链表的差别就是节点多了一个前驱指针域。