为何链表实现删除操作时不能只对head指针进行操作,而要新建新变量等于head指针?
小甲鱼《带你学C带你飞》第47集:单链表三为何要新建previous和current这些结构体指针对head进行赋值操作,而不能直接对head执行操作呢?
真心请各位大佬指教!
这是小甲鱼的版本:
void deleteNode(struct Node **head, int input){
struct Node *previous;
struct Node *current;
previous = NULL;
current = *head;
while(current != NULL && current->value != input){
previous = current;
current = current->next;
}
if (current == NULL){
printf("找不到匹配的节点...请重新输入\n");
return;
}
else{
if (previous == NULL){
*head = current->next;
}
else{
previous->next = current->next;
}
free(current);
}
}
这是我自己的版本:
void deleteNode(struct Node **head, int input){
while((*head) != NULL && (*head)->value != input){
*head = (*head)->next;
}
if ((*head) == NULL){
printf("没有匹配的节点,请重新输入\n");
}
}
首先,由于单链表只能从前往后遍历,不能回头,所以一定需要保存第一个节点才能访问完整的链表。也就是:必须在每个时刻都有一个指针是指向第一个节点的。既然目前head已经指向了它,那就不操作head,让head一直指向第一个节点好了。所以需要新建指针,来对链表进行操作。对链表的大部分操作都是这样处理的,不会动head指针。
其次,对于“删除链表”这个操作,假定删除的是current,那么需要把current的前一个节点的next指向current的后一个节点,然后释放current对应的内存。还是由于单链表不能回头,既然要访问current的前一个节点,就必须用一个指针指向current的前一个节点,在这里用previous表示这个指针了。再加上current本身也要保存(不然没办法释放current占用的内存),就至少需要两个指针了。
对链表的所有操作都画个图看比较明了~
页:
[1]