在单个链接列表中,我想获取一个编号为min
的特定节点,然后从列表中删除该节点。问题是,如果我要删除的号码到达列表的开头,它将永远不会被删除。我认为逻辑是正确的,我不知道我哪里错了。
struct Node *getMin(struct Node *head, int min){
struct Node *pre = (struct Node *)malloc(sizeof(struct Node));
pre->data = head->data;
if (pre->data == min)
{
head = head->next;
return pre;
}
else{
struct Node *temp = head;
struct Node *cur = temp->next;
while(cur != NULL){
if(cur->data == min){
temp->next = cur->next;
return cur;
}else{
temp = cur;
cur = cur->next;
}
}
}
return head;
}
答案 0 :(得分:0)
我不知道我在哪里错了?
除了头节点之外,所有其他节点都必须保持一个节点在前。
struct Node *cur = head;
while ( cur->next != NULL )
{
if ( cur->next->data == min )
{
struct Node *temp = cur->next;
cur->next = cur->next->next;
// Now temp is orphaned and can be returned to the calling
// function.
return temp;
}
else
{
cur = cur->next;
}
}
// Return NULL to the calling function indicating that
// the item was not found.
return NULL;
PS
使用
struct Node *pre = (struct Node *)malloc(sizeof(struct Node));
似乎不正确。当项目位于头节点时,您使用
head = head->next;
return pre;
会导致记忆泄漏。 head
的先前值将丢失到程序中。 prgoram无法取消分配它曾经指向的动态分配的内存。
这是整个功能主体的更新版本。
if (head->data == min)
{
struct Node *temp = head;
head = head->next;
// Now temp is orphaned and can be returned to the calling
// function.
retgurn temp;
}
struct Node *cur = head;
while ( cur->next != NULL )
{
if ( cur->next->data == min )
{
struct Node *temp = cur->next;
cur->next = cur->next->next;
// Now temp is orphaned and can be returned to the calling
// function.
return temp;
}
else
{
cur = cur->next;
}
}
// Return NULL to the calling function indicating that
// the item was not found.
return NULL;
PS 2
如果您使用的是C ++(如标签所示),请不要使用malloc
为节点分配内存。使用new
运算符。
无需使用struct Node* cur
来声明变量。使用Node* cur
。