NULL 값으로 설정됨NULL 값을 지시함data : 실제 값을 저장할 변수
next : 다음 노드의 포인터를 저장할 변수
headPointer : Linked List의 시작지점이 될 포인터
Add(T data) : 새로운 값을 Linked List에 추가
Insert(int index, T data) : index지점에 data를 추가
Delete(int index) : index지점의 요소를 제거
Clear() : Linked List내의 모든 요소를 제거
"LinkedList name"[int index] : index를 통해 해당 요소에 접근
template <typename T>
class Node
{
public:
Node(T value, Node *ptr) { data = value; next = ptr; }
T data;
Node *next;
};
template <typename T>
class LinkedList
{
private:
Node<T> *head;
public:
LinkedList() : head(nullptr) {}
void Add(T data)
{
Node<T> *newNode = new Node<T>(data, nullptr);
if (!head)
{
head = newNode;
}
else
{
Node<T> *temp = head;
while (temp->next)
{
temp = temp->next;
}
temp->next = newNode;
}
}
void Insert(int index, T data)
{
Node<T> *newNode = new Node<T>(data, nullptr);
if (index == 0)
{
newNode->next = head;
head = newNode;
return;
}
Node<T> *temp = head;
for (int i = 0; i < index - 1 && temp; i++)
{
temp = temp->next;
}
if (temp)
{
newNode->next = temp->next;
temp->next = newNode;
}
else
{
throw "Index out of bounds";
}
}
void RemoveAt(int index)
{
if (!head)
{
throw "List is empty";
}
if (index == 0)
{
Node<T> *temp = head;
head = head->next;
delete temp;
return;
}
Node<T> *temp = head;
for (int i = 0; i < index - 1 && temp; i++)
{
temp = temp->next;
}
if (temp && temp->next)
{
Node<T> *toDelete = temp->next;
temp->next = toDelete->next;
delete toDelete;
}
else
{
throw "Index out of bounds";
}
}
T operator[](int index)
{
Node<T> *temp = head;
for (int i = 0; i < index && temp; i++)
{
temp = temp->next;
}
if (temp)
{
return temp->data;
}
else
{
throw "Index out of bounds";
}
}
void Clear()
{
Node<T> *temp = head;
while (temp)
{
Node<T> *toDelete = temp;
temp = temp->next;
delete toDelete;
}
head = nullptr;
}
};
template <typename T>
class Node
{
public:
Node(T value, Node *ptr) { data = value; next = ptr; }
T data;
Node *next;
};
private:
Node<T> *head;
head 포인터만 존재 LinkedList() : head(nullptr) {}
head를 null 포인터를 생성해 연결Add(T date) & Insert(int index, T data) void Add(T data)
{
Node<T> *newNode = new Node<T>(data, nullptr);
if (!head)
{
head = newNode;
}
else
{
Node<T> *temp = head;
while (temp->next)
{
temp = temp->next;
}
temp->next = newNode;
}
}
newNode로 생성하면서 메모리를 동적 할당head가 비어있다면 head에 새로운 노드를 연결하는 것으로 완료head가 비어있지 않다면 next 노드가 비어있는 것을 찾아 해당 노드의 next에 새로운 노드를 연결 void Insert(int index, T data)
{
Node<T> *newNode = new Node<T>(data, nullptr);
if (index == 0)
{
newNode->next = head;
head = newNode;
return;
}
Node<T> *temp = head;
for (int i = 0; i < index - 1 && temp; i++)
{
temp = temp->next;
}
if (temp)
{
newNode->next = temp->next;
temp->next = newNode;
}
else
{
throw "Index out of bounds";
}
}
Add함수와 비슷하게 작동하나 특정 인덱스 위치에 값을 추가 for (int i = 0; i < index - 1 && temp; i++)
{
temp = temp->next;
}
head에서 시작해 선택한 인덱스 지점까지 이동해 해당 위치의 포인터가 null인지 확인 하고 그렇지 않다면 해당 노드의 next를 추가하고자 하는 노드의 next로 연결하고, temp 노드의 next를 새로 추가하는 노드로 설정RemoveAt(int index) void RemoveAt(int index)
{
if (!head)
{
throw "List is empty";
}
if (index == 0)
{
Node<T> *temp = head;
head = head->next;
delete temp;
return;
}
Node<T> *temp = head;
for (int i = 0; i < index - 1 && temp; i++)
{
temp = temp->next;
}
if (temp && temp->next)
{
Node<T> *toDelete = temp->next;
temp->next = toDelete->next;
delete toDelete;
}
else
{
throw "Index out of bounds";
}
}
index에 있는 값을 삭제하기 위해 Insert 함수와 같이 해당 노드까지 순차적으로 이동을 실시 T operator[](int index)
{
Node<T> *temp = head;
for (int i = 0; i < index && temp; i++)
{
temp = temp->next;
}
if (temp)
{
return temp->data;
}
else
{
throw "Index out of bounds";
}
}
arr[2]와 같이 접근하는 것을 구현하기 위해 operator[]를 선언해 구현Insert, RemoveAt함수와 유사하게 특정 인덱스까지 이동하고 해당 위치의 값을 반환