双向链表

双向链表

单链表查找某结点的后继结点的执行时间为O(1);单链表查找某结点的后继结点的执行时间为O(n)

在单链表的每个结点里再增加一个指向其直接前驱的指针域prior,这样链表中就形成了有两个方向不同的链

双向链表具有对称性:p->next->prior=p=p->prior->next

双向链表插入、删除时,须同时修改两个方向的指针时间复杂度均为O(n)

image

image


双向链表的定义

typedef struct Dulnode{
    int data;
    struct Dulnode *prior,*next;
}DulNode,*DuLinkList;

双向循环链表

  • 让头结点的前驱指针指向链表的最后一个结点
  • 让最后一个结点的后继指针指向头结点

image


双向链表的插入

image

  1. s->prior=p->prior;
  2. p->prior->next=s;
  3. s->next=p;
  4. p->prior=s;
DuLinkList GetElemP_Dul(DuLinkList L,int i){
    DuLinkList p;
    p=L->next;
    int j=1;
    while (p&&j<i){
        p=p->next;
        j++;
    }
    if(!p||j>i) return 0;
    return p;
}

int ListInsert_Dul(DuLinkList L,int i,int e){
    DuLinkList p,s;
    s=(DuLinkList)malloc(sizeof(DulNode));
    if(!(p=GetElemP_Dul(L,i))) return 0;
    s->prior=p->prior;
    p->prior->next=s;
    s->next=p;
    p->prior=s;
  	return 1;
}

双向链表的删除

删除带头结点的双向循环链表L的第i个元素,用e返回;

p->prior->next=p->next;p->next->prior=p->prior;

int  ListDelete_Dul(DuLinkList L,int i,int *e){
    DuLinkList p;
    if(!(p=GetElemP_Dul(L,i))) return 0;
    *e=p->data;
    p->prior->next=p->next;
    p->next->prior=p->prior;
    free(p);
    return 1;
}

时间复杂度O(1)

posted @ 2023-01-30 21:19  原语  阅读(100)  评论(0)    收藏  举报