Qn)如果只有一个指向要在单链表中删除的节点的指针,怎么做 你删除它?
我试图删除最后一个元素,即1,但else
部分进入无限
循环打印垃圾值。
int main()
{
struct Node* head = NULL;
push(&head, 1);
push(&head, 4);
push(&head, 6);
push(&head, 8);
print(head);
del_p(head->next->next->next);
cout << endl;
print(head);
return 0;
}
void del_p(struct Node* current)
{
struct Node* temp;
if (current->next != NULL)
{
temp = current->next;
current->data = temp->data;
current->next = temp->next;
free(temp);
}
else
{
free(current);
current = NULL;
}
}
答案 0 :(得分:1)
您的函数的else
分支会尝试将current
重新分配给NULL
。这是有问题的,因为current
是传入指针的本地副本。也就是说,您无法修改原始指针的值。
这就是您接收垃圾的原因,因为您正在访问其内存已被解除分配的节点。
您需要双指针,或者最好是对节点的引用:
void del_p(struct Node*& current)
答案 1 :(得分:0)
如果传入要删除的节点和头节点,则可以循环,直到找到要删除的节点之前的节点。然后,您需要将先前节点指向要删除的节点所指向的节点,然后您可以释放要删除的节点。
void delete(struct Node* to_delete, struct Node* head)
{
// check if node to be deleted is the head
if (to_delete == head)
{
head = to_delete->next;
return;
}
// make a local copy of the head just in case as to not alter it
struct Node* tempHead = head;
while(tempHead->next != to_delete)
{
tempHead = tempHead->next;
}
tempHead->next = to_delete->next;
free(to_delete);
}
就像免责声明一样,我没有测试过这段代码,但从概念上说它应该可行。
答案 2 :(得分:0)
删除链表上节点的典型算法将遵循以下步骤:
temp
开始Head
指针。temp
移至要删除的节点(在这种情况下是最后一个节点:temp->next == NULL
)。temp2
。temp->next
的指针设置为NULL
。head
。现在这不是唯一的算法,有很多方法可以实现这一目标。以下代码将是我对函数del_p
的解决方案(如果您想删除最后一个节点):
void del_p(struct Node *head)
{
if (head != NULL)
{
struct Node *temp = head;
while (temp->next != NULL) temp = temp->next;
free(temp);
}
}
您可以通过将指针传递给该节点(或值)来使此代码更通用,以便删除任何节点,代码如下所示:
void del_p(struct Node **head, struct Node *delete_node)
{
if (head != NULL)
{
struct Node *temp = *head;
if (temp == delete_node)
{
*head = (*head)->next;
free(temp);
}
else
{
while (temp->next != NULL && temp->next != delete_node)
temp = temp->next;
if (temp->next != NULL && delete_node != NULL)
{
temp->next = delete_node->next;
free(delete_node);
}
}
}
}
希望这对您有用,此代码未经过测试,但请告诉我您是否遇到麻烦!