现有非空双向链表 L,其结点结构为: prev 是指向前直接前驱结点的指针,next 是指向直接后继结点的指针。若要在 L 中指针 p 所指向的结点( 非尾结点) 之后插入指针 s 指向的新结点, 则在执行了语句序列: “s->next=p->next;p->next=s”,后,还要执行( )
解答:
设原来插入新结点前指...
用户登录可进行刷题及查看答案
设原来插入新结点前指向 p 的直接后继结点的指针为 q ,题目要求在 p 和 q 之间插入新的结点 s 。
双向链表插入结点的时候要修改四个指针,这四个指针的修改顺序没有强制要求,也就是有 4!=24 种连接顺序,但是这里注意要按照题目要求的顺序连线。
初始为图(a)。四个指针的初始状态为:
p->next = q; q->prev = p; s->next = null; s->prev = null;
最终状态为:
p->next = s; q->prev = s; s->next = q; s->prev = p;
先按照题目要求执行前两步:
s->next = q; 注意此时 q = p->next,即 s->next = p->next; 此时变为图(b)。
p->next = s; 此时变为图(c)。
还有两条线没有连,目标是得到图(d)。还需要连接 s->prev = p; 和 q->prev = s; 注意此时 q = s->next,即 s->next->prev = s; 找了一圈发现没有这种写法,命题组在这里加大了难度,把写法复杂化,我们只能逐一分析选项了。按照选项的指针在图(c)上运行:
A选项,等价于 q->prev = p; s->prev = p; 第一句错误。
B选项,等价于 s->prev = s; s->prev = p; 第一句错误。
C选项,等价于 s->prev = p; q->prev = s; 正确。
D选项,等价于 s->prev = null; q->prev = p; 第一句和第二句均错误。
本题选C。
登录后提交答案
暂无评论,来抢沙发