user3399655
user3399655

Reputation: 35

Remove node from a linked list

I have been stuck on this function to remove node from a list, if there are two names in the list they are both gone. If Anne and John are in the list and I want to delete Anne, then my list is empty, John is gone.

What am I missing to keep the connection in the list if I delete a node init?

bool ContactList::remove(string key)
{
      NodePtr prev = NULL;

       for(NodePtr temp = head; temp != NULL; temp = temp->link)
       {
            if(temp->data.key == key)
            {
                if(prev == NULL)
                {
                    head = temp->link;
                    delete temp;
                    return true;
                }
                else
                {
                    prev = temp->link;
                    delete temp;
                    return true;
                 }

             }

         }
     return false;
}

Upvotes: 0

Views: 135

Answers (2)

51k
51k

Reputation: 1443

Try using this function

bool ContactList::remove(string key)
{
  NodePtr prev = NULL;

   for(NodePtr temp = head; temp != NULL; temp = temp->link)
   {
        if(temp->data.key == key)
        {
            if(prev == NULL)
            {
                head = temp->link;
                delete temp;
                return true;
            }
            else
            {
                prev->link = temp->link;   // change.
                delete temp;
                return true;
             }

         }
         prev = temp;      // change.
     }
 return false;
}

Upvotes: 1

Paul Evans
Paul Evans

Reputation: 27577

You aren't keeping prev up to date in every iteration of your loop. You want something like:

prev = temp;

at the bottom of your for loop.

Upvotes: 2

Related Questions