数据结构:链表与逻辑问题

                                 

 

 优点缺点
链表

1.用多少开多少,直接链上去,没有空间浪费

2.头尾插入效率高 O(1)

不支持随机访问,顺序访问
顺序表1.支持随机访问,随机访问

1.增容时成倍增长,有空间浪费

2.中间或者头部插入数据时效率不高 O(N)

 

1.链表(空链表插入时,首尾指针都需要改变,从堆分配空间)

1.链表不是顺序表不需要移动元素,只要修改指针。

      链表只能进行按照顺序依次访问节点,无法做到随机访问。 

      因为链表删除元素不需要做元素移动,所以时间复杂度为O(1)。 

      链表是由节点构成,自然链表长度越大空间开销越大。 

      链表插入和删除元素因为不需要移动节点,所以相比较于数组而言,链表的时间复杂度为O(1),数组的时间复杂度O(n)。

2.在什么情况下用顺序表比链表好?

在顺序表中查找元素、获取表长非常容易,但是,插入或者删除一个元素却需要移动大量的元素;相反,在链表中插入或者删除一个元素很方便,但查找元素,需要进行遍历。因此,当所涉及的问题常常进行查找等操作,而插入、删除相对较少时,适合采用顺序表;当常常需要插入、删除的时候,适合采用链表。

链表与顺序表的不同(优缺点):

1.链表易于插入/删除,顺序表易于寻址。

2.链表是一种物理存储单元上非连续、非顺序的存储结构数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 

3.顺序表物理相邻逻辑相邻,链表逻辑相邻物理不一定相邻

4.

1.顺序存储结构---顺序表。顺序表以数组形式出现,可以取任意下标访问,所以是一种随机存取的存储结构。 

2.链式存储结构---链表。链表以链表的形式出现,必须从头开始访问,所以是一种顺序存取的存储结构。

5.

静态链表是用数组存储节点数据,模拟链表的实现,但是没有用到指针。每个数组节点包括两部分:data域和cursor(游标)域。data存储数据,cursor指明下个元素在数组中的下标。 

(1)存取第i个元素时,需要从头遍历到i-1和元素,由第i-1个节点的cursor,才能知道第i个元素存储的位置,因此和i是相关的。 

(2)使用数组对元素进行存储,在定义时大小已经确定。 

(3)插入和删除操作无需移动元素,只需要修改cursor游标的值即可,就像修改动态链表中的指针一样。

6.

     1.循环链表是另一种形式的链式存贮结构。它的特点是表中最后一个结点的 指针 域指向 头结点 ,整个链表形成一个环。         

  •              (1)单循环链表——在单链表中,将终端结点的指针域NULL改为指向表头结点或开始结点即可。 

                 (2)多重链的循环链表——将表中结点链在多个环上。 

  • 指针 ,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向 循环链表 

7.链表插入:

          空链表插入时, 首指针需要改变。

          非空链表插入时,尾指针需要改变

8.

顺序存储是指用物理上相邻的单元存储线性表的元素,就是可以用数组实现。 

访问节点只需要下标,所以是O(1), 增加和删除节点要整体移动目标元素后面的元素,最坏的情况是N次,所以是O(n)。

9.

一:顺序表的特点是逻辑上相邻的数据元素,物理存储位置也相邻,并且,顺序表的存储空间需要预先分配。 

它的优点是: 

(1)方法简单,各种高级语言中都有数组,容易实现。 

(2)不用为表示节点间的逻辑关系而增加额外的存储开销。 

(3)顺序表具有按元素序号随机访问的特点。 

缺点: 

(1)在顺序表中做插入、删除操作时,平均移动表中的一半元素,因此对n较大的顺序表效率低。 

(2)需要预先分配足够大的存储空间,估计过大,可能会导致顺序表后部大量闲置;预先分配过小,又会造成溢出。 

二、在链表中逻辑上相邻的数据元素,物理存储位置不一定相邻,它使用指针实现元素之间的逻辑关系。并且,链表的存储空间是动态分配的。 

链表的最大特点是: 

插入、删除运算方便。 

缺点: 

(1)要占用额外的存储空间存储元素之间的关系,存储密度降低。存储密度是指一个节点中数据元素所占的存储单元和整个节点所占的存储单元之比。 

(2)链表不是一种随机存储结构,不能随机存取元素。

线性表是由n个数据元素组成的,数据项组成数据元素。

 

链表中的长度问题

A

头指针是指向第一个元素(结点)的指针。 

删除单链表中的第一个元素时只需要将头指针指向第二个元素,然后释放第一个元素储存空间申请的内存。与链表长度无关。 

1

2

3

ListNode *temp = head->next;

head->next = temp->next;

free(temp);

B

尾指针是指向最后一个元素(结点)的指针,与头指针类似。 

删除单链表中的最后一个元素时 由于不是双向链表,所以要从头指针开始,一直遍历直到倒数第二个元素,将倒数第二个元素(结点)指向NULL,释放原末端元素(结点)空间后,将尾指针等于新的末端元素(结点)。所以与链表长度有关。

1

2

3

4

5

ListNode *p = head;

while(p->next != rear) p = p->next;

p->next = NULL;

free(r);

r = p;

 

C

在单链表第一个元素前插入一个新元素时,只需要把新的元素(结点)指向原来的第一个元素(结点),然后使头指针指向新的元素(结点)。与链表长度无关。 

1

2

new_point->next = head->next;

head->next = new_point;

D

在单链表最后一个元素后插入一个新元素时,只需先将新结点指向NULL,然后将尾指针指向的原末端结点指向新的元素(结点),最后将尾指针指向新的元素(结点)。与链表长度无关。 

1

2

3

new_point->next = NULL;

rear->next = new_point;

rear = new_point;

双向循环链表与双向链表

http://www.cnblogs.com/AsuraDong/p/7009564.html

双向链表中,我们可以直接删除当前指针所指向的节点。而不需要像单向链表中,删除一个元素必须找到其前驱。 

因此在插入数据时,单向链表和双向链表操作复杂度相同,而删除数据时,双向链表的性能优于单向链表

带头双向循环链表

 

 

单向链表:只有一个指向下一个节点的指针。

优点:单向链表增加删除节点简单。遍历时候不会死循环;

缺点:只能从头到尾遍历。只能找到后继,无法找到前驱,也就是只能前进。

适用于节点的增加删除。

不带头单链表

  1. 单向、双向
  2. 带头、不带头
  3. 循环、非循环

 带头单链表

 

双向链表:有两个指针,一个指向前一个节点,一个后一个节点。双向链即是这样一个有序的结点序列,每个链表元素既有指向下一个元素的指针,又有指向前一个元素的指针,其中每个结点都有两种指针,即left和right。left指针指向左边结点,right指针指向右边结点。

优点:可以找到前驱和后继,可进可退;

缺点:增加删除节点复杂,需要多分配一个指针存储空间。

适用于需要双向查找节点值的情况。

不带头双向链表 

 

静态链表: 对于没有指针的编程语言,可以用数组替代指针,来描述链表。让数组的每个元素由data和cur两部分组成,其中cur相当于链表的next指针,

https://www.cnblogs.com/zhaoxy/p/7754906.html

 

循环链表:指的是在单向链表和双向链表的基础上,将两种链表的最后一个结点指向第一个结点从而实现循环。

单链表:指的是链表中的元素的指向只能指向链表中的下一个元素或者为空,元素之间不能相互指向。也就是一种线性链表。

循环单链表

单链表只有一个指针域,是指向直接后继的。没有指向直接前驱。
循环链表也是只指向直接后继。
只有双向链表有两个指针域,分别指向直接前驱和后继。要存取值得修改两个指针
顺序表是在计算机内存中以数组的形式保存的线性表。它是数组,不用考虑修改指针,只用修改下标

 

逻辑问题

有序表中所有元素以递增或递减方式排列,对数据之间的关系进行了描述,是一种逻辑结构。 

顺序表是指用一组地址连续的存储单元依次存储数据元素的线性结构。 

哈希表 用散列法存储的线性表叫散列表。 

单链表 用一组地址任意的存储单元存放线性表中的数据元素,均只是一种存取结构,不是逻辑结构。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值