ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

数据结构与算法(四)链式存储结构(其他链表)

2021-09-25 21:32:29  阅读:166  来源: 互联网

标签:复杂度 next 链表 prior 链式 数据结构 Tb 指针


一、循环链表

        优点:可以从任意一个结点出发查找其他结点

         检空:判断尾指针是否指向头指针

p!=L
p->next!=L

         通过头指针 H 查找an的时间复杂度为O(n)、a1的时间复杂度为O(1)

                 a1的存储位置为R->next->next

                 an的存储位置为R

                通过尾指针 R 查找an、a1的时间复杂度为O(1)

        将两个带尾指针的循环链表合并

LinkList Connect(LinkList Ta,LinkList Tb){
    p=Ta->next;//p保存表头结点
    Ta->next = Tb = next->next;//Tb表头连接Ta表尾
    delete Tb->next;//释放Tb的头指针
    Tb->next = p;//修改指针
    return Tb;
}

时间复杂度为O(1)

二、双向循环链表(在每个结点里增加一个前驱指针域prior)

        可以直接查找一个结点的前驱结点(不需要像单链表一样绕场一周)

        定义

typedef struct DuLNode{
    ElemType data;
    sturct DuLNode *prior,*next;
}DuLNode,*DuLinkList;

         双向链表具有对称性,在插入和删除时需要修改两个指针,操作的时间复杂度均为O(n)

         插入

void ListInsert_Dul(DuLinkList &L,int i, ElemType e){
    if(!(p=GetElemP_Dul(L,i))) return ERROR;//查找位置,如果没有直接返回错误
    s= new DuLNode;    s->data=e;
    
    s->prior = p->piror;    p->prior->next=s;//连接前驱元素
    s->next = p;     p->piror=s;//连接后继元素
    return OK;
}

        删除

void ListDelete_Dul(DuLink &L,int i,ElemType &e){
    if(!(p=GetElemP_Dul(L,i))) return ERROR;//查找位置,如果没有直接返回错误
    e=p->data;
    
    p->prior->next = p->next;//断开前驱指针
    p->next->prior=p->prior;//断开后继指针
    
    delete p;
    return OK;
}

 多种链表的比较(时间复杂度)

顺序表与链表的对比

标签:复杂度,next,链表,prior,链式,数据结构,Tb,指针
来源: https://blog.csdn.net/weixin_37878740/article/details/120476580

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有