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)-这是一个递归的表,它的长度是2。E相当于一个无限的列表 E=(a,(a,(a,…))),这个广义表在计算机可以实现。
无穷大常见于数学,计算机设计上不会考虑那么没有市场。
7、在一个有N个元素的有序单链表中查找具有给定关键字的结点,平均情况下的时间复杂性为O(N)
分析:单链表只能顺序跑下去查找,没有捷径。平均查找次数为N/2,所以复杂度为0(N)
8、元素在集合中有序,指的是元素插入过程中记录了元素的插入顺序。
9、线性表(a1,a2…an)以链接方式存储时,访问第i个位置元素的时间复杂性是O(n).
分析:元素在链表的位置为i,意味着通过遍历执行i次,则i<n,可以知道时间复杂度为O(n)