【问题标题】:How can I delete an node from a linked list with a single pointer?如何使用单个指针从链表中删除节点?
【发布时间】:2020-03-24 13:41:02
【问题描述】:

我研究的这本书#include 是一个练习,要求我们修改以下代码,该代码从链表中删除一个节点,并构建另一个只用一个指针完成精确操作的函数:

struct node {
    int value;
    struct node * next;
};

struct node delete_from_list( struct node * list , int n){
struct node *cur, *prev;

for (cur = list, prev = NULL;
    cur != NULL && cur -> value != n;
    prev = cur, cur -> next)
;

if(cur == NULL)
    return list;
else if(prev == NULL)
    list = list -> next;
else
prev -> next = cur -> next;

free(cur);
return list;
}

我在网上看到的一些代码是:

struct node *delete_from_list(struct node **list, int n) {
    struct node *entry = *list;
    while (entry) {
        if (entry->value == n) {
            *list = entry->next;
            free(entry);
            break;
        }
        list = &entry->next;
        entry = entry->next;
    }
    return *list;
}

但我对此有两个反对意见:

  1. 这段代码实际上包含两个指针entrylist

  2. 我们正在 free()ing entry 但继续使用它,“感觉”像一个错误。

如果您愿意提供帮助,请解释我的反对意见或编写新代码。谢谢。

【问题讨论】:

  • 我先用一张纸和一支铅笔画出情况。
  • ad.2:一旦释放,您就没有使用该条目。有一个break;
  • 是的,我画了它,但它实际上是让我质疑它的原因。我画了entry 指向一个由两个框组成的块,这意味着struct node 结构。而使用free(entry) 只是用一个巨大的十字架替换了两个盒子的块。没错,不是吗?
  • @PaulOgilvie 哦,好的。现在这更有意义。谢谢,但代码不是还有2个指针吗?
  • 欢迎来到stackoverflow!这是一个不错的小练习。我知道你对这两个指针的意思,但我认为问题设置器不包括参数。如果包含参数,那么原始代码有三个:list、cur、prev。

标签: c data-structures linked-list


【解决方案1】:
  1. 这段代码实际上包含两个指针entrylist

您需要构建一个使用单个指针的算法。在您的情况下,虽然看起来像两个,entry算法使用的 一个 指针 除了 list 实际上是 的输入包含算法的函数

  1. 我们正在free()ing 该条目但继续使用它“感觉”像一个错误。

代码释放后不使用entry。一旦被释放,循环立即中断,因为break 语句在调用free 之后。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-13
    • 2013-06-15
    • 2012-03-10
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多