Reputation: 758
I have created a LinkedList class that has a function for deleting the first element in the list and one that deletes the last element in the list. The first one is easy, after I delete the element, I set it to point to the next element. Works great. However, when I delete the last element, I have to point it to the previous element in the list which becomes the last at that point. I cannot figure out how to do this. Please advise. Here is the code:
void LinkedList::pop_front()
{
mFront->data = NULL;
mFront = mFront->next;
}
How can I get a function to delete the last element but reset the tail to point to the new tail?
void LinkedList::pop_back()
{
mBack->data = NULL;
...
}
class LinkedList
{
public:
// Default Constructor
// Purpose: Initializes an empty list
// Parameters: none
// Returns: none
LinkedList();
// The push_front function
// Purpose: add an item to the front of the list
// Parameters: a int item for the front
// Returns: none
void push_front(int data);
// The push_back function
// Purpose: insert an item into the back of the list
// Parameters: int item to add the the back
// Returns: none
void push_back(int data);
// The pop_front function
// Purpose: delete the item in the front of the list
// Parameters: none
// Returns: none
void pop_front();
// the pop_back function
// Purpose: remove the item at the end of the list
// Parameters: none
// Returns: none
void pop_back();
// The getFirst function
// Purpose: print the first item in the list
// Parameters: none
// Returns: none
void getFirst();
// the GetLast function
// Purpose: return the last item in the list
// Parameters: none
// Returns: none
void getLast();
void printList();
// the clear function
// Purpose: clear the list, free memory
// Parameters: none
// Returns: none
void clear();
// Destructor
// Purpose: clear up memory
// Parameters: none
// Returns: none
~LinkedList();
private:
LinkedList *mFront; // point to the front of our list
LinkedList *mBack; // point to the back of our list
LinkedList *next; // the next node
LinkedList *previous; // the previous node
int data; // our list data manipulator
Upvotes: 0
Views: 4524
Reputation: 258618
If the list isn't double linked, you'll have to start at the first element to find the last one:
void LinkedList::pop_back()
{
mBack->data = NULL;
current = mFront;
do{
current = current->next
} while ( current->next );
mBack = current;
}
Very important - since data
appears to be a pointer, you're possibly running into a memory leak. Just setting data = NULL
doesn't free the memory, you'll have to explicitly delete it:
delete mFront->data;
Upvotes: 1
Reputation: 36049
Singly linked lists do not offer O(1) deletion of the last element. You'll have to run through the whole list from the start to find the second-to-last element.
Node* i = mFront;
while ( i->next != mBack ) i = i->next;
mBack = i;
Upvotes: 4