2026 数据结构 二叉树遍历 选择题
第 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

  • 问题 1cu->p2 正是要被重新设置的指针,用它作为循环条件不合适。
  • 问题 2:仍然没有判断 cu->p1 == NULL,尾结点处依然可能发生非法访问。❌ C
cu->p1 == NULL
  • 对于非尾结点,令:cu->p2 = cu->p1->p1
  • 对于尾结点,令:cu->p2 = NULL
  • 每轮循环最后都执行 cu=cu->p1,保证遍历能够继续向后推进,不会死循环。因此,正确答案为 D