링크드 리스트 삽입 삭제

#include <iostream>
#include <string>

using namespace std;

class Node {
	friend class LinkedList;
	int data;
	Node* next;

	Node(int X) {
		this->data = X;
		this->next = NULL;
	}
};

class LinkedList {
public:
	Node* head;
	Node* tail;
	int size;

	LinkedList() {
		head = tail = NULL;
		this->size = 0;
	}
	void addFront(int X);
	void removeFront();
	void front();
	void empty();
	void showList();
	void addBack(int X);
	
};

void LinkedList::addFront(int X)
{
	Node* node = new Node(X);
	//node->data = X;
	node->next = head;
	head = node;
	if (size == 0)
		tail = head;
	size++;
}

void LinkedList::removeFront()
{
	if (head != NULL)
	{
		Node* removal = head;
		cout << removal->data << "\n";
		head = head->next;
		delete removal;
	}
	else
	{
		cout << -1 << "\n";
	}
}

void LinkedList::front()
{
	if (head == NULL)
	{
		cout << -1 << "\n";
	}
	else
	{
		cout << head->data << "\n";
	}
}

void LinkedList::empty()
{
	if (head == NULL)
	{
		cout << 1 << "\n";
	}
	else
	{
		cout << 0 << "\n";
	}
}

void LinkedList::showList()
{
	if (head == NULL)
	{
		cout << -1 << "\n";
	}
	else
	{
		Node* scan = head;
		while (scan != NULL)
		{
			cout << scan->data << " ";
			scan = scan->next;
		}
		cout << "\n";
	}
}

void LinkedList::addBack(int X)
{
	Node* node = new Node(X);
	tail->next = node;
	tail = node;
	if (size == 0)
		head = tail;
	size++;
}

int main()
{
	LinkedList list;
	int n;
	cin >> n;
	string str;
	for (int i = 0; i < n; i++)
	{
		cin >> str;
		if (str == "addFront")
		{
			int X;
			cin >> X;
			list.addFront(X);
		}
		else if (str == "removeFront")
		{
			list.removeFront();
		}
		else if (str == "front")
		{
			list.front();
		}
		else if (str == "empty")
		{
			list.empty();
		}
		else if (str == "showList")
		{
			list.showList();
		}
		else if (str == "addBack")
		{
			int X;
			cin >> X;
			list.addBack(X);
		}
	}
	return 0;
}

최대한 혼자서 해결해보려고 했는데 하루종일 해도 답이 나오지 않아서 질문드립니다.

정수를 저장하는 단일 링크드 리스트를 생성하고, 다음의 명령어들을 처리하는 프로그램을 작성하시
오.
명령어는 다음과 같이 총 6가지이다.
 addFront X: 정수 X를 리스트의 가장 앞에 삽입. (단, 1 ≤ X ≤ 100,000).
 removeFront: 리스트에서 가장 앞에 있는 정수를 삭제하고, 삭제된 수를 출력. 만약
리스트가 비어 있는 경우, -1을 출력.
 front: 리스트의 가장 앞에 저장된 정수를 출력. 만약 리스트가 비어 있는 경우, -1을 출력.
 empty: 리스트가 비어 있으면 1, 비어 있지 않으면 0을 출력.
 showList: 리스트에 저장되어 있는 정수들을 앞(front)에서부터 차례대로 공백을 사이에
두고 모두 출력. 만약 리스트가 비어 있는 경우, -1을 출력.
 addBack X: 정수 X를 리스트의 가장 뒤에 삽입. (단, 1 ≤ X ≤ 100,000).
입력
첫 번째 줄에 명령어의 수 N (1 ≤ N ≤ 100,000)이 주어진다. 두 번째 줄부터 N개의 줄에는 명령어가 하
나씩 주어진다.
출력
출력해야 하는 명령어가 주어질 때마다 그 결과를 한 줄씩 출력한다

addBack을 제외하면 구현이 잘되는것 같습니다.
addBack도 런타임에러가 발생하기는 하지만 채점프로그램에서는 정답으로 나왔는데 런타임에러를 처음 겪어봐서 어떻게 처리를 해야할지 모르겠습니다. 검색해보니 메모리 문제때문에 런타임에러가 발생할수 있다고 하는데 메모리를 줄일수 있는 방법은 delete로 알고 있습니다. 하지만 어떤부분을 delete해야하는지 잘 모르겠습니다.
추가적으로 고쳐야 할 부분있다면 지적 부탁드립니다.

"리스트"로 검색 해 보시면, 이전에 올라왔던 귀중한 관련 답글/팁 들을 보실수 있겟읍니다.

안녕하세요. ㅎㅎㅎ

정수를 저장하는 리스트인데 비어있으면 -1을 출력하는 함수가 많네요
-1이 저장되어있으면 어떡하려구~ ^^

첫번째로 데이터를 add할때는 잘하셨는데요.
마지막으로 데이터를 제거할때는 처리를 안해주셨네요.

리스트의 데이터가 한개있을때 remove를 하고 다시 addback을 했을때 어떻게될지 생각해보세요

아 그부분을 처리 안했었네요

void LinkedList::addBack(int X)
{
	if (size == 0)
	{
		Node* node = new Node(X);
		head = node;
		tail = node;
		size++;
	}
	else
	{
		Node* node = new Node(X);
		tail->next = node;
		tail = node;
		size++;
	}
}
void LinkedList::removeFront()
{
	if (size == 1)
	{
		cout << head->data << "\n";
		head = tail = NULL;
		size = 0;
	}
	else if (size > 1)
	{
		Node* removal = head;
		cout << removal->data << "\n";
		head = head->next;
		delete removal;
		size--;
	}
	else
	{
		cout << -1 << "\n";
	}
}

이런식으로 처리하니깐 잘 구현되네요. 이렇게 하면 되는건가요?
addBack 부분에서 조건을 나누지 않고 한번에 처리하면 안되는지 궁금해요

그 방법에 대해서 조언을 해드리자면,

말씀하신 조건을 나누는 문제는 head 와 tail이 같아서 생기는 문제에요.
size가 0에서 1로 갈때, 1에서 0으로 갈때 생기는 문제지요.

방법은 많지만, 간단하게 생각을 해보면 head node와 tail node를 추가하는 방법이 있어요.
즉 메모리를 더 써서 코드를 간단하게 하는 방법이죠.

링크드리스트를 만들면 위와 같이 되는겁니다.

head node와 tail node 사이에 노드들을 추가한다면
아무리 삭제를 반복해도 head == tail 일이 없겠죠?
같아지는 경우 자체가 존재하지 않으니 코드는 더 단순해질수 있겠죠.
물론 메모리는 조금 더 쓰겠지만요 ^^/

head node나 tail node의 값을 size로 쓰시는 방법도 있지요~