题34

题目

Q:【2021 统考真题】已知头指针 h 指向一个带头结点的非空单循环链表,结点结构为 ,其中 next 是指向直接后继结点的指针,p 是尾指针,q 是临时指针。现要删除该链表的第一个元素,正确的语句序列是( )。
A. hnext = hnextnext; q = hnext; free(q);
B. q = hnext; hnext = hnextnext; free(q);
C. q = hnext; hnext = qnext; if (p != q) p = h; free(q);
D. q = hnext; hnext = qnext; 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;) 此时要考虑一种特殊情况, 若待删结点是链表的尾结点, 即循环单链表中只有一个元素 (pq 指向同一个结点),如图 2 所示,则在删除后要将尾指针指向头结点,即 if (p == q) p = h; 最后释放 q 结点即可,答案选 D

图 1

图 2