题34
题目
Q:【2021 统考真题】已知头指针 h 指向一个带头结点的非空单循环链表,结点结构为
A. h→next = h→next→next; q = h→next; free(q);
B. q = h→next; h→next = h→next→next; free(q);
C. q = h→next; h→next = q→next; if (p != q) p = h; free(q);
D. q = h→next; h→next = q→next; if (p == q) p = h; free(q);
分析
A:我感觉C也可以啊, 如果只有一个元素,p和q是相同的,但是只有不同才能进行释放,此时释放不掉
D选项,对于只有一个元素当前情况可以正常释放
C选项如果不是只有一个元素,也能正常释放删除

解
D
如图 1 所示,要删除带头结点的非空单循环链表中的第一个元素,就要先用临时指针 q 指向待删结点, q = h->next; 然后将 q 从链表中断开, h->next = q->next; (这一步也可写成 h->next = h->next->next;) 此时要考虑一种特殊情况, 若待删结点是链表的尾结点, 即循环单链表中只有一个元素 (p 和 q 指向同一个结点),如图 2 所示,则在删除后要将尾指针指向头结点,即 if (p == q) p = h; 最后释放 q 结点即可,答案选 D 。

图 1

图 2