단일 연결 리스트의 단점인 단방향 흐름을 2개의 링크 필드를 이용하여 양방향으로 움직일 수 있게 만든 것
세가지 필드로 구성되어 있다.
class node {
private:
node *next;
node *prev;
int value;
node(int value);
friend class DoublyLinkedList;
};
node::node(int value) {
this->value = value;
next = prev = nullptr;
}
class DoublyLinkedList {
private:
int listSize;
node *header;
node *trailer;
public:
DoublyLinkedList();
bool empty();
int getSize();
void setSize(int size);
void print();
void printReserve();
void append(int value);
void insert(int idx, int value);
int erase(int idx);
void update(int oldValue, int newValue);
};
empty()
bool DoublyLinkedList::empty() {
return (getSize() == 0);
}
getSize()
int DoublyLinkedList::getSize() {
return listSize;
}
setSize()
void DoublyLinkedList::setSize(int size) {
this->listSize = size;
}
맨뒤에 노드를 나타내는 trailer 바로 앞에다가 노드를 추가
void DoublyLinkedList::append(int value) {
node *newNode = new node(value);
newNode->next = trailer;
newNode->prev = trailer->prev;
trailer->prev->next = newNode;
trailer->prev = newNode;
setSize(getSize() + 1);
print();
}
맨앞에 추가하고 싶은 경우
맨뒤에 추가하고 싶은 경우
중간에 추가하고 싶은 경우
void DoublyLinkedList::insert(int idx, int value) {
if (idx < 0 || idx > getSize()) {
return;
}
if (idx == 0) {
node *newNode = new node(value);
newNode->next = header->next;
newNode->prev = header;
header->next->prev = newNode;
header->next = newNode;
setSize(getSize() + 1);
} else if (idx == getSize()) {
append(value);
} else {
node *newNode = new node(value);
node *curNode = header->next;
for (int i = 0; i < idx - 1; i++) {
curNode = curNode->next;
}
newNode->prev = curNode;
newNode->next = curNode->next;
curNode->next->prev = newNode;
curNode->next = newNode;
setSize(getSize() + 1);
}
}
int DoublyLinkedList::erase(int idx) {
if (empty() || idx >= getSize()) {
return -1;
} else {
node *delNode = header->next;
for (int i = 0; i < idx; i++) {
delNode = delNode->next;
}
delNode->prev->next = delNode->next;
delNode->next->prev = delNode->prev;
int delVal = delNode->value;
delete delNode;
setSize(getSize() - 1);
return delVal;
}
}
void DoublyLinkedList::update(int oldValue, int newValue) {
if (empty()) {
cout << "empty" << endl;
return;
} else {
node *curNode = header->next;
bool find = false;
while (curNode->next != nullptr) {
if (curNode->value == oldValue) {
curNode->value = newValue;
find = true;
}
curNode = curNode->next;
}
if (find) {
print();
} else {
cout << "Not found" << endl;
}
}
}
앞에서 부터 하나씩 값을 출력
void DoublyLinkedList::print() {
if (empty()) {
cout << "empty" << endl;
return;
} else {
node *curNode = header->next;
while (curNode->next != nullptr) {
cout << curNode->value << " ";
curNode = curNode->next;
}
cout << endl;
}
}
뒤에서 부터 하나씩 값을 출력
void DoublyLinkedList::printReserve() {
if (empty()) {
cout << "empty" << endl;
return;
} else {
node *curNode = trailer->prev;
while (curNode->prev != nullptr) {
cout << curNode->value << " ";
curNode = curNode->prev;
}
cout << endl;
}
}