2021-01-07

链式表的一些易错概念(单链表,双链表,循环链表)

**1.**顺序存储结构既可用于“顺序存取”,又可用于“随机存取”;
链式存取结构只能用于“顺序存储”。
**2:**顺序存储方式:逻辑上相邻的元素,物理上也相邻
链式存储方式:存储结构能反映数据之间的的逻辑关系。
散列存储:通过散列函数映射到物理空间,不能反应数据之间的逻辑关系。
**3.**顺序存储方式:不只是可以存储线性结构,还可以存储“树”,“图”。
线性表采取顺序存储时:取线性表的第i个元素的时间与i的大小无关。
线性表采取链式存储时:取线性表的第i个元素的时间与i的大小有关
**4.**假设线性表有2n个元素:
(1)删除所有值为x的元素,
顺序表与链式表的时间复杂度均为O(n)。但是顺序表要移动很多元素,所以在单链表上实现的效率要比顺序表上更高。
(2)在最后一个元素的后面插入一个新元素
顺序表的效率更高(直接找到第2n-1个元素插入)
单链表:遍历整个单链表找到尾结点,然后插入新结点,时间复杂度O(n)。
(3)顺序输出前K个元素
单链表与顺序表效率相同。
**5.**n个元素的一维数组,建立一个有序单链表的最低时间复杂度:
(1) 先建立链表,然后依次插入建立有序表,即每插入一个元素就需遍历链表寻找插入位置,即直接插入排序,时间复杂度为O(n^2).
(2)先将数组排好序,然后建立链表,
建立链表的时间复杂度O(n),数组排序的最短时间(折半查找)复杂度O(nlog2n),所以总的时间复杂度为O(nlog2n)。
**6.**将长度为n的单链表链接在长度为m的单链表后面,其算法时间复杂度O(m):
先遍历长度为m的单链表,找到该单链表的尾结点,并在尾结点后面插入长度为n的单链表的首结点,因为要遍历整个长度为m的单链表,所以时间复杂度为O(m).
**7.**在一个长度为n的带头结点的单链表h上,设有尾指针r,则执行()操作与链表表长有关
(1)删除单链表中的第一个元素
已知头结点->next就是第一个元素,时间复杂度为O(1)
(2)删除单链表中的最后一个元素
需要找到最后一个元素的前驱结点,因此需要遍历整个单链表时间复杂度为O(n)。
(3)在单链表第一个元素前插入一个新元素
已知头结点,用头结点->next指向新元素即可,时间复杂度为O(1)
(4)在单链表最后一个元素后插入一个新元素
已知存在尾结点,尾结点指向单链表的最后一个元素,最后一个元素->next指向新元素,即可。时间复杂度为O (1).
**8.**某线性表用带头结点的循环单链表存储,头指针为head,当head->next->next=head成立时,线性表长度可能是(0或为1)。
若为0则有:head->next->next=head->next=head
若为1则有:head->next->next=head
**9.**一个链表最常用的操作是在末尾插入结点和删除结点,则选用()最节省时间。
(1)带头结点的双循环链表
设头结点为head,头结点:head->next 尾结点:head->prior;
末尾后插入结点:head->prior-next=插入的新结点,时间复杂度O(1)。
删除尾结点(需要找到尾结点的前驱结点):head->prior->prior->next=head
时间复杂度O(1)。
(2)单循环链表
(3)带尾指针的单循环链表
设尾指针为r,尾结点:r->next
末尾插入结点:r->next->next=插入的新结点 ,时间复杂度O(1)。
删除尾结点:需要找到尾结点的前驱结点,因为是单循环链表,所以需要遍历整个单链表来找到前驱结点,时间复杂度O(n)
(4)单链表
**10.**对n个元素的线性表的运算有四种:删除第一个元素;删除最后一个元素;在第一个元素之前插入新元素;在最后一个元素之后插入新元素;
假设尾指针存在设为r,头指针存在设为head;
(1)只有尾结点指针没有头结点指针的循环单链表
尾指针:r 尾结点:r->next 第一个元素:r->next->next
删除第一个元素:r->next->next=r->next-next->next 时间复杂度O(1)
删除最后一个元素:找到r的前驱结点,需要遍历整个链表,时间复杂度O(n)。
在第一个元素之前插入新元素:r->next->next=新结点,时间复杂度O(1)。
在最后一个元素之后插入新元素: r->next->next=新结点 ,时间复杂度O (1)
(2)只有尾结点指针没有头结点指针的非循环双链表
尾指针:r 尾结点:r->next
删除第一个元素:
需要遍历整个双链表,寻找第一个元素时间复杂度为O(n).
删除最后一个元素:找到该双链表的前驱结点,时间复杂度为O(1)
在第一个元素之前插入新元素:因为没有头结点,遍历整个链表找到第一个元素,然后找到它的前驱,时间复杂度为O(1)。
在最后一个元素之后插入新元素:r->next->next=新元素,时间复杂度为O(1).
(3)只有头结点指针没有尾结点指针的循环双链表
头结点:head 第一个元素:head->next 尾结点:head->prior
删除第一个元素:head->prior->next=head->next->next 时间复杂度O(1)
删除最后一个元素:找到最后一个元素的前驱元素:head->prior->prior
时间复杂度:O(1).
在第一个元素之前插入新元素:head->prior->next=新元素 时间复杂度O(1)
在最后一个元素之后插入新元素:head->prior->next=新元素 时间复杂度O(1)
(4)即有头结点指针又有尾结点指针的循环单链表
头结点:head 尾指针:r 第一个元素:head->next 最后一个元素(尾结点):r->next
删除第一个元素:r->next->next=head->next->next 时间复杂度O(1).
删除最后一个元素:需要找到前驱结点,即需遍历整个链表,时间复杂度为O(n)
在第一个元素之前插入新元素:r->next->next=新元素 时间复杂度O(1)
在最后一个元素之后插入新元素:r->next->next=新元素 时间复杂度O(1)。

  • 16
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值