공부/Data Structure

double linked list 구현

Lero God 2020. 7. 13. 22:14

싱글 링크드 리스트와는 다르게 노드가 이전 노드와 이후 노드를 둘 다 가르기코 있음!.!

특이하게도 처음 생성자에서 head와 tail이 아무런 값을 가지고 있지 않은 더미 노드를 가르키게 만들어 준당

더블 링크드 리스트에선 특정 위치의 노드를 삭제하거나 삽입 할 때 노드들을 연결해주는 linkNodes를 구현했다 :)

 

template <typename T>
class doubleLinkedList
{
public:
	// push back element!
	void push_back(T element)
	{
		node<T>* newNode = new node<T>(element);

		linkNodes(tail, newNode);

		++size;
	}

	// find element at selected index
	node<T>* findNode(int findIndex)
	{
		node<T>* ptr = head->next;

		for (int index = 0; index < size; ++index)
		{
			if (index == findIndex)
			{
				return ptr;
			}

			ptr = ptr->next;
		}

		return nullptr;
	}

	// insert element at selected index
	void insertNode(T element, int insertIndex)
	{
		if (size < insertIndex || insertIndex < 0)
		{
			cout << "Can't insert index :(!" << endl;
			return;
		}

		node<T>* newNode = new node<T>(element);
		node<T>* nextNode = findNode(insertIndex);

		linkNodes(nextNode, newNode);

		++size;
	}

	// delete element at selected index
	void deleteNode(int insertIndex)
	{
		if (size < insertIndex || insertIndex < 0)
		{
			cout << "Can't delete index :(!" << endl;
			return;
		}

		node<T>* nextNode = findNode(insertIndex + 1);
		node<T>* deleteNode = nextNode->prev;

		linkNodes(nextNode, deleteNode->prev);
		delete deleteNode;

		--size;
	}
	
    // link nodes
	void linkNodes(node<T>* nextNode, node<T>* newNode)
	{
		nextNode->prev->next = newNode;
		newNode->prev = nextNode->prev;
		newNode->next = nextNode;
		nextNode->prev = newNode;
	}

	// return size of container
	int Size(void) const
	{
		return size;
	}

	// delete all nodes in container
	void Clear(void)
	{
		node<T>* tempPtr = head->next;
		node<T>* deletePtr = head->next;

		for (int index = 0; index < size; ++index)
		{
			tempPtr = deletePtr->next;
			delete deletePtr;
			deletePtr = tempPtr;
		}

		delete head;
		delete tail;

		size = 0;
	}

private:
	node<T>* head;
	node<T>* tail;
	int size;

public:
	doubleLinkedList() : size(0), head(nullptr), tail(nullptr) 
	{
		head = new node<T>();
		tail = new node<T>();
		head->next = tail;
		tail->prev = head;
	};

	~doubleLinkedList() {};
};

'공부 > Data Structure' 카테고리의 다른 글

single linked list 구현  (0) 2020.07.12
queue 구현  (0) 2020.07.12
stack 구현  (0) 2020.07.08