鱼C论坛

 找回密码
 立即注册
查看: 1408|回复: 1

[已解决]为何链表实现删除操作时不能只对head指针进行操作,而要新建新变量等于head指针?

[复制链接]
发表于 2019-7-18 19:28:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
小甲鱼《带你学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占用的内存),就至少需要两个指针了。
对链表的所有操作都画个图看比较明了~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-7-18 21:57:04 | 显示全部楼层    本楼为最佳答案   
首先,由于单链表只能从前往后遍历,不能回头,所以一定需要保存第一个节点才能访问完整的链表。也就是:必须在每个时刻都有一个指针是指向第一个节点的。既然目前head已经指向了它,那就不操作head,让head一直指向第一个节点好了。所以需要新建指针,来对链表进行操作。对链表的大部分操作都是这样处理的,不会动head指针。
其次,对于“删除链表”这个操作,假定删除的是current,那么需要把current的前一个节点的next指向current的后一个节点,然后释放current对应的内存。还是由于单链表不能回头,既然要访问current的前一个节点,就必须用一个指针指向current的前一个节点,在这里用previous表示这个指针了。再加上current本身也要保存(不然没办法释放current占用的内存),就至少需要两个指针了。
对链表的所有操作都画个图看比较明了~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-18 18:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表