使用二级指针对单链表的删除操作进行优化,原因在于链表每一个结点内部都有一个link指针,原来的做法是在遍历链表时,用一个当前指针current指向当前结点,再用一个指针previous去指向current结点的前驱,两个指针都是指向的结点,这样当对头结点进行操作时,就要判断特殊条件,
改进的思路是,使用previous成为二级指针,让它去指向前一个结点的link域,这样在进行删除结点时,就可以直接用*previous操作,省去了对头结点的特殊判断。。。
这个思路要把链表的头指针看成是一个数据域为的结点,用一个二级指针去指向该结点的link域,
操作如果
struct Node
{
int data;
struct Node *next;
};
//删除结点。
bool delnode(struct Node **head, int element)
{
struct Node *current, **previous = head; //链表头相当于一个没有数据的空结点。让previous去指针这个空结点的link域
struct Node *pdel = NULL;
while((current=*previous)!=NULL && (element!=current->data))
{
previous = &(*previous)->next;
}
if(current !=NULL) //没有找到
{
pdel = current;
*previous = current->next;
free(pdel);
}
return true;
}
让previous去指向下一个结点指向前一个结点的link域.
这个对头结点判断的优化方法,可以用来实现其它东西.在二叉搜索树中可以进行优化.