大家好 我在技术访谈中询问的网站上看到了这个问题
节点有一个数据指针,并指向一些数据。
有人可以帮我理解这个问题的详细含义吗?
这是否意味着Node具有指向另一个节点的指针,并指向其他一些数据节点。并且该数据节点不指向任何其他节点。 在这种情况下,我们的节点将有两个指针。
我真的很困惑。请帮助。提前致谢
答案 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本身就是一个指针。这种数据结构很常见,数据本身可能很大,无法保存在内存中或同一节点内。
编辑:
看问题链接:我上面提到的假设似乎就是这样。您需要做的就是从节点的数据字段中获取指针,并在删除节点之前删除。