链表学习(2)

来源:互联网 发布:微信分销系统源码 编辑:程序博客网 时间:2024/06/18 13:10

1(1)对于双向循环链表,在p指针所指的节点之后插入s指针所指节点的操作应为:

s->left=p;

s->right=p->right;

p->right->left=s;

p->right=s;

 

分析:双向链表的插入顺序,先搞定插入节点的前驱和后继,再搞定后节点的前驱,最后搞定前节点的后继。

 

(2)补充:在非空双向循环链表中q所指向的结点前插入一个由p所指的链结点的过程:

rlink(p)<-q;

llink(p)<-llink(q);

llink(q)<-p;

rlink(llink(p))<-q;

 

双链表的插入两种方法

一、               首先处理新插入节点p的后继、前驱,然后再处理后继的前驱

p->next=q;//p的后继

p->pre=q->pre;//p的前驱

q->pre=p;//q的前驱

p->pre->next=p;//新结点的前驱(p->pre)的后继

 

二、p->next=q;//p的后继

p->pre=q->pre;//p的前驱

       q->pre->next=p;//这一步在前面

       q->pre=p;

 

2、数组比链表的存储空间小,是指占用的存储空间少。因为链表结点需要持有额外的指针,因此所占用的空间较数组更大。

 

3、有一个单向链表,头指针和尾指针分别为p,q,以下哪项操作的复杂度不受队列长度的影响?

删除头部元素;头部元素之前插入一个元素;尾部元素之后插入一个元素;

删除尾节点需要知道它前驱结点的指针。由于是单链表,不能直接由尾部节点得到前一个节点。

 

4、对长度为无穷大的广义表,由于存储空间的限制,不能在计算机中实现、

分析:区别长度无穷大和无限列表。由于计算机资源的限制,长度无穷大的广义表不能再计算机中实现。但是若考虑一个广义表E=(a,E)-这是一个递归的表,它的长度是2E相当于一个无限的列表 E=(a,(a,(a,))),这个广义表在计算机可以实现。

无穷大常见于数学,计算机设计上不会考虑那么没有市场。

 

7、在一个有N个元素的有序单链表中查找具有给定关键字的结点,平均情况下的时间复杂性为O(N)

分析:单链表只能顺序跑下去查找,没有捷径。平均查找次数为N/2,所以复杂度为0(N)

 

8、元素在集合中有序,指的是元素插入过程中记录了元素的插入顺序。

 

9、线性表(a1,a2an)以链接方式存储时,访问第i个位置元素的时间复杂性是O(n).

分析:元素在链表的位置为i,意味着通过遍历执行i次,则i<n,可以知道时间复杂度为O(n)

0 0