w7813396 发表于 2019-7-18 19:28:00

为何链表实现删除操作时不能只对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");
    }
}

砚堂_ 发表于 2019-7-18 21:57:04

首先,由于单链表只能从前往后遍历,不能回头,所以一定需要保存第一个节点才能访问完整的链表。也就是:必须在每个时刻都有一个指针是指向第一个节点的。既然目前head已经指向了它,那就不操作head,让head一直指向第一个节点好了。所以需要新建指针,来对链表进行操作。对链表的大部分操作都是这样处理的,不会动head指针。
其次,对于“删除链表”这个操作,假定删除的是current,那么需要把current的前一个节点的next指向current的后一个节点,然后释放current对应的内存。还是由于单链表不能回头,既然要访问current的前一个节点,就必须用一个指针指向current的前一个节点,在这里用previous表示这个指针了。再加上current本身也要保存(不然没办法释放current占用的内存),就至少需要两个指针了。
对链表的所有操作都画个图看比较明了~
页: [1]
查看完整版本: 为何链表实现删除操作时不能只对head指针进行操作,而要新建新变量等于head指针?