Skip to main content

Linked List

實作一個 linked list,包含下列方法:

  • insertAtBeginning()
  • insertAtEnd()
  • deleteNode()
  • display()
#include <iostream>

using namespace std;

class LinkedList {
private:
struct Node {
int data;
Node* next;
Node(int val) : data(val), next(nullptr) {}
};
Node* head;
public:
LinkedList() : head(nullptr) {}
~LinkedList() {
Node* cur = head;
while (cur) {
Node* temp = cur->next;
// 刪除目前的 pointer
delete cur;
// 移動 cur pointer
cur = temp;
}
head = nullptr;
}

// 加到 linked list 前面
void insertAtBeginning(int val) {
// 建立一個新的 node
Node* newNode = new Node(val);

// newNode->next 為 head
newNode->next = head;

// 接到 head 上
head = newNode;
}

// 加到 linked list 後面
void insertAtEnd(int val) {
// 一樣先建立一個 node
Node* newNode = new Node(val);

// 如果 head 不存在的話,接到 head 上
if (!head) {
head = newNode;
return;
}
// linked list 的特性
// 只能走訪到最後一個 node
// 先用一個暫時的指標 temp 指到 head
Node* temp = head;
while (temp->next) {
// 移動到最末端
temp = temp->next;
}
// 接到最後面
temp->next = newNode;
}

void deleteNode(int val) {
// 如果 head 不存在,return
if(!head) return;

// 如果 head 是要被 delete 的 node
// 刪除那個 node
if (head->data == val) {
Node* temp = head;
// 移動 head pointer
head = head->next;
delete temp;
return;
}

// 如果不是的話,繼續找 node
Node* cur = head;
// 建立一個 prev dummy node
Node* prev = nullptr;
while (cur && cur->data != val) {
// 將 cur 接到 prev 上
prev = cur;
cur = cur->next;
}

// 如果沒找到的話 return
if (!cur) return;

// update the pointer for prev
prev->next = cur->next;
delete cur;
}
void display() {
// 用一個 temp pointer 指到 head
Node* temp = head;
while (temp) {
cout << temp->data << " -> ";
temp = temp->next;
}
std::cout << "NULL" << std::endl;
}
};

int main() {
LinkedList list;
list.insertAtEnd(10);
list.insertAtEnd(20);
list.insertAtBeginning(5);
list.insertAtEnd(30);

std::cout << "Linked List: ";
list.display();

std::cout << "Deleting node with value 20" << std::endl;
list.deleteNode(20);
list.display();

return 0;
}