双向链表
双向链表结构与单链表类似,但是它的每个结点有两个指针,分别用来指向它的前驱结点(pre)和后继结点(next)。把它构造成双向循环链表时,从任意一个结点的方向出发都能访问整个链表。
除此之外,双向链表的操作与单链表相似,但在插入与删除结点时要注意指针的指向。
1、双向链表的结点
1 class Node
2 {
3 public:
4 int data;
5 Node *pre; //前驱指针
6 Node *next; //后继指针
7 }
2、双向链表插入结点
1 //p为双向链表将要插入结点的前驱结点
2 if( p->next ==NULL ){ //注意插入节点位置是否为末尾
3 p->next = node;
4 node->pre = p;
5 }else{
6 node->next = p->next;
7 p->next->pre = node;
8 p->next = node;
9 node->pre = p;
10 }
3、双向链表删除结点
1 Node *q = p->next;
2 if( q->next ==NULL ){ //注意删除节点位置是否为末尾
3 p->next = NULL;
4 }else{
5 p->next = q->next;
6 q->next->pre = p;
7 }
8 delete q;
9 length--;