如何在单个链表中删除某个节点并返回该节点?

时间:2019-02-05 22:53:01

标签: c++ data-structures

在单个链接列表中,我想获取一个编号为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;
}

1 个答案:

答案 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