連結串列(Linked List)是一種線性資料結構,由一系列節點組成,每個節點包含資料和指向下一個節點的指標。
與陣列不同,連結串列的節點不需要連續的記憶體空間。
* 需要維護尾指標
#include <iostream>
using namespace std;
struct Node {
int data;
Node* next;
Node(int val) : data(val), next(nullptr) {}
};
class LinkedList {
private:
Node* head;
public:
LinkedList() : head(nullptr) {}
// 插入到頭部
void insertAtHead(int val) {
Node* newNode = new Node(val);
newNode->next = head;
head = newNode;
}
// 插入到尾部
void insertAtTail(int val) {
Node* newNode = new Node(val);
if (!head) {
head = newNode;
return;
}
Node* curr = head;
while (curr->next) {
curr = curr->next;
}
curr->next = newNode;
}
// 刪除指定值
void deleteNode(int val) {
if (!head) return;
if (head->data == val) {
Node* temp = head;
head = head->next;
delete temp;
return;
}
Node* curr = head;
while (curr->next && curr->next->data != val) {
curr = curr->next;
}
if (curr->next) {
Node* temp = curr->next;
curr->next = temp->next;
delete temp;
}
}
// 顯示串列
void display() {
Node* curr = head;
while (curr) {
cout << curr->data << " -> ";
curr = curr->next;
}
cout << "NULL" << endl;
}
~LinkedList() {
Node* curr = head;
while (curr) {
Node* temp = curr;
curr = curr->next;
delete temp;
}
}
};
int main() {
LinkedList list;
list.insertAtHead(3);
list.insertAtHead(2);
list.insertAtHead(1);
list.insertAtTail(4);
list.display(); // 1 -> 2 -> 3 -> 4 -> NULL
list.deleteNode(2);
list.display(); // 1 -> 3 -> 4 -> NULL
return 0;
}
class DoublyLinkedList {
private Node head;
private Node tail;
private class Node {
int data;
Node prev;
Node next;
Node(int d) { data = d; }
}
public void addFirst(int data) {
Node newNode = new Node(data);
if (head == null) {
head = tail = newNode;
} else {
newNode.next = head;
head.prev = newNode;
head = newNode;
}
}
public void addLast(int data) {
Node newNode = new Node(data);
if (tail == null) {
head = tail = newNode;
} else {
tail.next = newNode;
newNode.prev = tail;
tail = newNode;
}
}
public void printForward() {
Node curr = head;
while (curr != null) {
System.out.print(curr.data + " <-> ");
curr = curr.next;
}
System.out.println("NULL");
}
public void printBackward() {
Node curr = tail;
while (curr != null) {
System.out.print(curr.data + " <-> ");
curr = curr.prev;
}
System.out.println("NULL");
}
}