看了网上删除链表指定节点的帖子时,提到了使用二级指针的方法,且对教材经典方法颇为不屑。
在下不才,却认为这两种方法均出自同源,无有优劣之分。愿细释之
首先,我们抛出问题:给定头结点,要求删除链表中的指定节点 注:不可以覆盖节点内的值,以区分一道google面试题
对于这个问题, 我首先会下一个定论: 若要删除指定节点,必然要遍历链表 且需要一个当前变量cur来记录当前节点 以查询是否为待删节点。
cur用来记录当前节点,这时,遍历过程中找到了待删节点。于是,在图谋删除它的时候,发现另外一个定论:
定论: 若要删除当前节点,必须能够改变 前一节点的next域指针,以完成删除。
总结一下: 依照上述两个定论,且看下面对 二级指针和教科书法的分析:
教科书中: 设置了节点指针变量 cur , 此为定论一
设置了节点指针变量 pre, 为的是能够改变前一节点的指针域, 此为定论二
二级指针方法:
设置了 node **cur, 二级指针。 为了满足 定论一:其中*cur 存储了当前节点的地址。 那么cur是如何遍历的呢?
*cur->next 是一个指针变量, 取这个变量的地址交给cur,则cur自动更新为下一个节点的二级指针。
如何满足定论二: 二级指针cur是如何更改上一节点的指针域呢? cur指向的指针变量 正是上一个节点内 next指针变量。
故如欲改变上一个指针的next域, 只需改变 *cur 的值即可。
总结: 二级指针cur通过指向上一个节点的next变量, 成为了当前节点的二级指针
也因为它指向的了上一个节点next指针变量,故而可以改变上一个next域的值,从而删除当前节点。
这两个方法,都逃不出上述的两个定论。 从算法层面看,用哪种方法均无优劣之分。