【发布时间】:2020-04-12 16:57:50
【问题描述】:
我在以递归方式从循环单链表中删除单个节点/值时遇到了一些问题(当然,如果可能的话)。我的代码仅从中间删除,而不是从第一个或最后一个位置删除。
在以递归方式删除其中一个后,我无法弄清楚如何建立连接。我的意思是,如果我要删除第一个元素,那么我需要将最后一个节点连接到下一个节点。
这是我的代码:
Node *ListDelete(Node *list, Node *tail, int val, Node **deleted) {
if (!list || (list == tail && list->value != val)) {
*deleted = NULL;
return list;
}
if (list->value == val) {
*deleted = list;
return list->next;
}
list->next = ListDelete(list->next, tail, val, deleted);
return list;
}
参数和返回:
case MENU_DELETE:
val = GetValue("Enter value");
if (list) tail = FindTail(list);
list = ListDelete(list, tail, val, &node);
ListPrintNode(node, "Deleted");
free(node);
寻尾功能:
Node* FindTail(Node* list)
{
Node* temp = list;
while(temp->next != list)
temp = temp->next;
return temp;
}
【问题讨论】:
-
这是可能的,但我没有看到任何尝试重新连接上一个和下一个元素。您需要将前一个节点传递给递归函数,否则无法将其链接到已删除节点之后的元素。请展示一个失败的最小示例以及所需的结果应该是什么。谢谢。
-
您可能应该具体说明如果您尝试删除例如 2 元素列表的第一个或最后一个元素会发生什么。你还没有发布完整的代码,所以我无法重现任何东西,而且我也不知道我试图重现什么行为。
-
仅当节点位于中间或末尾时才删除,当我尝试删除第一个节点时,它只会将节点传递到末尾..如果有单个或 2-元素程序崩溃。
-
参数和返回值应该是什么?特别是
tail是什么? 我的代码只从中间删除,而不是从第一个或最后一个位置删除。这是一个要求吗?循环列表实际上没有尾巴。 -
tail 它的最后一个节点,这是我的停止条件,当 tail == list 我知道我现在在最后一个节点。如果您需要删除第一个节点,您需要知道谁是最后一个节点,因为您需要建立该连接。
标签: c linked-list