相比于单链表,除了指向下一个节点的next指针,双向链表在每个节点中,还设置了一个指向前驱节点的prev指针。
双链表示意图
优点:有了向前指向的指针,双向链表的反向查找操作无疑优于单链表,求得了以空间换时间的效果。
缺点:插入或删除节点操作比单链表复杂,需要维护两个指针变量。
双向链表插入结点过程:
双向链表删除结点过程:
完整代码:
#include<iostream>
using namespace std;
typedef int DataType;//双向链表
struct ListNode//节点结构体
{
ListNode* _prev;
ListNode* _next;
DataType _data;
ListNode(DataType x)
:_prev(NULL)
,_next(NULL)
,_data(x)
{}
};
class List
{
typedef ListNode Node;//节点重命名
public:
List()
:_head(NULL)
,_tail(NULL)
{}
List(const List& l)
:_head(NULL)
,_tail(NULL)
{
Node* cur = l._head;
while(cur)
{
PushBack(cur->_data);
cur = cur->_next;
}
}
List &operator=(List l)
{
swap(_head,l._head);//深拷贝的现代写法(借助中间变量交换指针)
swap(_tail,l._tail);
}
void