第 2 题
设有一个双向链表 L,结构为 [p2, p1],头结点为 head。初始时 head = cu。现要将每个结点的 p2 指向 p1 指向结点的直接后继,应该进行的操作是( )。
A. while(cu!=NULL) {cu->p2=cu->p1->p1; cu=cu->p1;}
B. while(cu!=NULL && cu->p2!=NULL) {cu->p2 = cu->p1->p1; cu = cu->p1;}
C. while(cu!=NULL) {if(cu->p1!=NULL) {cu->p2=cu->p1->p1; cu=cu->p1;}}
D. while(cu!=NULL) {if(cu->p1!=NULL) {cu->p2=cu->p1->p1;} else {cu->p2=NULL;} cu=cu->p1;}
[tag_link]
正确答案:D
**【解析】**题意澄清
双向链表结点结构为
[p2, p1]p1:后继指针(next)p2:需要被重新设置目标:让每个结点的
p2指向“p1所指结点的直接后继”,即:cu->p2 = cu->p1->p1若
cu->p1 == NULL(尾结点),则不存在“p1所指结点的直接后继”,此时应令:cu->p2 = NULL同时,遍历过程中必须始终推进
cu,否则会产生死循环。
逐项分析❌ A
- 问题 1:
cu->p2正是要被重新设置的指针,用它作为循环条件不合适。 - 问题 2:仍然没有判断
cu->p1 == NULL,尾结点处依然可能发生非法访问。❌ C
cu->p1 == NULL
- 对于非尾结点,令:
cu->p2 = cu->p1->p1 - 对于尾结点,令:
cu->p2 = NULL - 每轮循环最后都执行
cu=cu->p1,保证遍历能够继续向后推进,不会死循环。因此,正确答案为 D。