您的位置:首页 > 其它

如何实现双向链表的插入、删除操作

2017-08-20 11:07 579 查看

如何实现双向链表的插入、删除操作

  循环单链表的出现,虽然能够实现从任一结点出发沿着链能找到其前驱结点,但是时间复杂度为O(N)。如果希望能从链表中快速确定某一个结点的前驱,另一个解决方法就是在单链表的每一个结点再增加一个指向其前驱的指针ptr。这样形成的链表中就有两条方向不同的链,被称为双向链表(Double
Link List),简称双链表。它是由头指针head唯一确定的。带头结点的双链表的某些运算变得方便。将头结点和尾结点链接起来,为双循环链表。

带头结点的双链表结构如下图所示:

 


双链表的形式描述:

Typedef struct dlistnode

{

   DataType data;

   struct dlistnode *prior,*next;

}DListNode;

typedef DListNode *DLinkList;

DLinkList head;

由于双链表的对称性,在双链表中能方便地完成各种插入、删除操作。

在双向链表的结点p之后插入一个新的结点s:

 


void DInsert()

{

  //假设p!= NULL

  DListNode *s = malloc(sizeof(DListNode));

  s->next = p->next;

  s->prior = p;

  p->next = s;

  s->next->prior = s;

}

双链表上删除结点p的后一个结点q的操作为:

 


void DDeleteNode()

{

  q= p->next;

  p->next= q->next;

  q->next->prior= p;

  free(q);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐