🔗 Bài giảng: Linked List (có mô phỏng trực quan)
Linked List gồm các node được nối liên tiếp bằng con trỏ next.
Ta có thể chèn/xoá node ở đầu hoặc giữa rất nhanh — không cần dời toàn bộ phần tử như mảng.
I. Mô phỏng Linked List
🛠 Thao tác
💡 Nhập giá trị và thao tác để thấy Linked List thay đổi.
💻 Code đang chạy
Node* head = NULL;
Node* p = new Node(x);
p->next = head;
head = p;
Node* p = new Node(x);
if(head == NULL) head = p;
else tail->next = p;
if(head->val == x) head = head->next;
cur->next = cur->next->next;
cout << head->val;
📊 Linked List
II. Lý thuyết cơ bản
Linked List là cấu trúc dữ liệu **linh hoạt**, đặc biệt mạnh trong thao tác chèn/xoá.
- Insert đầu: O(1)
- Insert cuối: O(1) nếu có tail
- Delete node: O(1) nếu biết node trước đó
- Duyệt: O(n)
III. Khi nào dùng Linked List
1) Khi có rất nhiều thao tác chèn/xoá
👉 Insert/Delete O(1) → mạnh hơn mảng.
2) Khi bài yêu cầu mô phỏng con trỏ
👉 Con trỏ trái/phải, xoá tại vị trí → đặc trưng Linked List.
3) Khi xử lý bằng slow/fast pointer
👉 Tìm giữa, tìm chu kỳ, tìm node thứ k từ cuối.
4) Khi bài yêu cầu đảo ngược dãy hoặc đảo một đoạn
👉 Đổi con trỏ, không phải đổi chỗ phần tử như array.
5) Khi bộ nhớ phân mảnh
👉 Linked List không cần vùng nhớ liên tục.
IV. Bài tập luyện tập
📘 Cơ bản
1️⃣ Chèn đầu/cuối danh sách
Node* push_front(Node* head, int x){
Node* p = new Node(x);
p->next = head;
return p;
}
📗 Trung bình – Two pointers
2️⃣ Tìm phần tử giữa
Node* mid(Node* head){
Node *slow=head, *fast=head;
while(fast && fast->next){
slow=slow->next;
fast=fast->next->next;
}
return slow;
}
📙 Nâng cao
3️⃣ Reverse toàn bộ Linked List
🐉 HSG – khó
4️⃣ Floyd Cycle Detection
🔚 Mô phỏng giúp bạn hiểu rõ Linked List hoạt động thế nào trong thực tế.
💳 Quét mã ủng hộ tuỳ tâm nhé!