二话不说先上代码,这是摘自网上的一段代码,用以解读题目所说的问题。
// 假设h为指向链表头结点指针,那么head就是指向h指针的指针
void delete(node ** head)
{
for (node** curr = head; *curr; )
{
/* curr指向h的地址,所以*curr的值是h内存里存的东西,也就是 第一个节点的地址。从而entry指向第一个节点*/
node * entry = *curr;
if (isRemoveOrNot(entry))
{ // 找到了,curr存着next指针的地址,加*也就是修改next指针变量内存里的东西,也就是下一个节点的地址。所以这里把next保存的地址改成待删除节点的第一个节点的地址,完成删除。
*curr = entry->next;
free(entry);
}
// 还没找到,entry->next指向下一个节点,也就是保存了下一个节点的地址,再用&取地址,也就是得到next指针的地址,所以curr指向next指针的地址。
else
curr = &entry->next;
}
}
大致思路是首先用一个二级指针指向头指针,然后利用一个一级指针指向第一个节点,接着开始遍历,如果没找到,则把当前节点的next指针的地址保存到二级指针里,一次循环结束,下一次继续从二级指针中取得下一个节点的指针,找不到继续把当前节点的next指针的地址保存到二级指针,如此类推,直到找到了,这时候,通过二级指针修改next指针所保存的值,也就是下一节点的地址。