删除链接列表的最后一个节点。每个节点都有一个指向某些数据的数据指针

时间:2011-03-22 07:01:51

标签: c data-structures

大家好 我在技术访谈中询问的网站上看到了这个问题

节点有一个数据指针,并指向一些数据。

有人可以帮我理解这个问题的详细含义吗?

这是否意味着Node具有指向另一个节点的指针,并指向其他一些数据节点。并且该数据节点不指向任何其他节点。 在这种情况下,我们的节点将有两个指针。

我真的很困惑。请帮助。

提前致谢

4 个答案:

答案 0 :(得分:2)

列表的节点结构非常清楚。在C中,它看起来像是:

typedef struct list list;
struct list {
        list *next;
        void *data;
}

但是,如果您的任务是删除链接列表的最后一个节点,则该任务不明确。在单个链表中,通常在前面插入新节点,因为这可以在恒定时间内完成。因此,仍然不清楚“最后一个节点”是指最近插入的节点(因此是前节点),还是指的是插入的第一个节点(因此是您在看到的最后一个节点)遍历清单)。

在第一种情况下,删除列表list的“最后”节点非常容易,因为它是前节点:list = list->next。您可能希望合并空列表的边缘情况:list = list?list->next:NULL

在第二种情况下,你应该删除先插入的节点,这有点棘手。您必须遍历列表,维护指向当前元素的指针,此外还有指向该元素的指针。以下是一些您可能会觉得有用的代码:

cur = list->next;
prev = list;

while (cur->next != NULL) {
        prev = cur;
        cur = cur->next;
}

prev->next = NULL;

free(cur->data);
free(cur);

此代码遍历列表并在cur指向最后一个节点(下一个指针指向NULL的唯一列表节点)时停止。然后,我们通过将前一个元素的下一个指针设置为NULL来取消链接最后一个节点。

请注意,您有两种特殊情况:
- 列表最初是空的(这里无事可做)
- 列表只包含一个元素(即第一个元素最后一个元素,切换到前面描述的方法)

答案 1 :(得分:0)

也许这会为你解决一些问题:http://en.wikipedia.org/wiki/Linked_list

链表中的每个节点都有一个指向下一个节点和一些数据的指针。数据永远不是指向同一列表中节点的指针。

编辑: 因此,给定一个列表,您应该编写一个删除最后一个节点的函数,并确保新的最后一个节点指向NULL。

答案 2 :(得分:0)

链接列表表示:[data1, p1]->[data2, p2]->[data3, p3](p3指向无)

您应该删除data3,p3,并将p2设置为null,这样就不会丢失指针!

答案 3 :(得分:0)

理想情况下应该是:Node有一个“Next”指针,而node-data本身就是一个指针。这种数据结构很常见,数据本身可能很大,无法保存在内存中或同一节点内。

编辑:

看问题链接:我上面提到的假设似乎就是这样。您需要做的就是从节点的数据字段中获取指针,并在删除节点之前删除