双向链表中有两个指针域 llink 和 rlink,分别指向该结点的前驱及后继。设p指向链表中的一个结点,他的左右结点均为非空。现要求删除结点 $p$,则下列语句序列中正确的是( )。
这题考双向链表删除操作。拿到题先别急着看选项,脑子里过一遍‘前驱的后继’和‘后继的前驱’这两步逻辑,确认p的左右邻居非空,然后对比每个选项的赋值顺序和语法,排除那个把指针域赋值的左右搞反的陷阱。
最容易掉进的坑是A选项,它把前驱结点的rlink直接赋给了p->rlink,这会导致前驱结点丢失,p->llink变成空指针,后续p->llink->rlink就会报错。另外,有些同学会忽略赋值顺序,以为先改后继再改前驱,其实顺序不影响结果,但必须保证两个指针域都改对,否则链表会断。还有,delete p要放在最后,不然p被释放后,再去访问p->llink或p->rlink就是野指针了。
考点与概念:双向链表每个结点有两个指针域llink和rlink,分别指向前驱和后继。删除结点p的本质就是让p的前驱的后继指向p的后继,同时让p的后继的前驱指向前驱,最后释放p。只要p的左右邻居非空,这两步就能安全完成。
命题视角:NOIP初赛爱考这种‘语法细节+逻辑顺序’的组合陷阱。命题人故意把A选项写成p->rlink->llink=p->rlink,看起来很像正确的‘后继指向前驱’,但实际上是把前驱结点的rlink直接赋给了p->rlink,导致前驱结点被覆盖,p->llink瞬间失效。这种‘看似合理实则致命’的写法就是考点。
思考心法:拿到题先想‘我要改哪两个指针域’?答案是p->llink->rlink和p->rlink->llink。然后看选项里是不是都改了这两个域,而且赋值方向对不对。A选项只改了p->rlink->llink,却把p->llink->rlink改成了p->rlink,方向反了,所以A错。B、C、D三个选项都正确地改了这两个域,只是写法不同:B是标准写法;C把p->rlink->llink拆成两步,先让后继指向前驱,再让后继的llink指向p->rlink(其实就是p->rlink),逻辑等价;D把p->llink->rlink拆成两步,先让后继指向前驱,再让后继的llink指向p->llink,逻辑也等价。
计算与验证:以B为例,p->llink->rlink = p->rlink把前驱的后继指向后继,p->rlink->llink = p->llink把后继的前驱指向前驱,最后delete p释放p。C和D同理,只是把其中一个赋值拆成两步,不影响最终结果。A因为第一步就把前驱的后继改成了p->rlink,导致p->llink变成空,第二步p->llink->rlink就会访问空指针,语法错误或逻辑错误。
避坑:千万别选A,它把前驱结点‘抹掉’了,链表会断。另外,delete一定要放在最后,不然p被释放后,再去访问p->llink或p->rlink就是野指针了。还有,别以为赋值顺序很重要,其实先改前驱还是先改后继都不影响结果,只要两个域都改对就行。
考频与趋势:链表是高频考点,题库共81题,覆盖7个级别。NOIP提高组初赛每年都有,2010年考了2题,2014年3题,2015年3题,2023年6题,2024年26题,2025年16题,2026年10题,呈明显上升趋势,尤其是近四年(2023-2026)占比极高,说明命题组对链表操作越来越重视。GESP六级11题、五级42题也大量涉及,说明从入门到提高都考。
预测:基于2023-2026年NOIP提高组初赛链表题数量激增(2024年26题、2025年16题、2026年10题),未来几年链表相关题目(尤其是删除、插入、指针域赋值细节)大概率继续高频出现,命题人可能会继续用‘看似正确实则错误’的选项来挖坑,比如把前驱或后继的指针域赋值方向写反,或者把delete提前导致野指针。建议考生熟练掌握双向链表删除的标准写法,并警惕A这类‘前驱后继混淆’的陷阱。