就是在单链表的的每个结点中,再设置一个指针域,也就是每个结点都有两个指针域,一个指向它的前驱结点,一个指向它的后继结点。
typedef struct DuLNode {
type data ;
struct DuLNode *prior ; // 前驱指针
struct DuLNode *next ; // 后继指针
}DuLNode , *DuLinkList;
双向链表也可以有循环链表。
那么对于双向循环链表来说,每个结点p都有两种表示自己的方法,分别是
p->next->prior (p后继的前驱)
p->prior->next (p前驱的后继)
双向链表的插入与删除:
要把结点s插入到ai和ai+1之间
令p指向ai,则p->next就指向ai+1
1. s->prior=p 让s的前驱指针指向ai
2. s->next=p->next 让s的后继指针指向ai+1
3. p->next->prior=s 让ai+1的前驱指针指向s
4. p->next=s 让ai的后继指针指向s
注意顺序 先搞定s的前驱后继,再搞定ai+1的前驱和ai的后继(记忆:前驱后继,前驱后继)
在ai-1、ai、ai+1的连续的双向链表中删除ai,令p指向ai。
1. p->prior->next=p->next
让ai-1的后继指针指向ai+1
2. p->next->prior=p->prior
让ai+1的前驱指针指向ai-1
记忆:先后继再前驱