|
| 1 | +# Danh sách liên kết (Linked List) |
| 2 | + |
| 3 | +_Đọc bằng ngôn ngữ khác:_ |
| 4 | +[_简体中文_](README.zh-CN.md), |
| 5 | +[_Русский_](README.ru-RU.md), |
| 6 | +[_日本語_](README.ja-JP.md), |
| 7 | +[_Português_](README.pt-BR.md), |
| 8 | +[_한국어_](README.ko-KR.md), |
| 9 | +[_Español_](README.es-ES.md), |
| 10 | +[_Türkçe_](README.tr-TR.md), |
| 11 | +[_Українська_](README.uk-UA.md) |
| 12 | + |
| 13 | + |
| 14 | +Trong khoa học máy tính, một danh sách liên kết là một bộ sưu tập tuyến tính |
| 15 | +các phần tử dữ liệu, trong đó thứ tự tuyến tính không được xác định bởi |
| 16 | +vị trí vật lý của chúng trong bộ nhớ. Thay vào đó, mỗi |
| 17 | +phần tử trỏ đến phần tử tiếp theo. Đây là một cấu trúc dữ liệu |
| 18 | +bao gồm một nhóm các nút cùng đại diện cho |
| 19 | +một chuỗi. Dưới dạng đơn giản nhất, mỗi nút |
| 20 | +bao gồm dữ liệu và một tham chiếu (nói cách khác, |
| 21 | +một liên kết) đến nút tiếp theo trong chuỗi. Cấu trúc này |
| 22 | +cho phép việc chèn hoặc loại bỏ các phần tử một cách hiệu quả |
| 23 | +từ bất kỳ vị trí nào trong chuỗi trong quá trình lặp. |
| 24 | +Các biến thể phức tạp hơn thêm các liên kết bổ sung, cho phép |
| 25 | +việc chèn hoặc loại bỏ một cách hiệu quả từ bất kỳ phần tử nào |
| 26 | +trong chuỗi dựa trên tham chiếu. Một nhược điểm của danh sách liên kết |
| 27 | +là thời gian truy cập tuyến tính (và khó điều chỉnh). Truy cập nhanh hơn, |
| 28 | +như truy cập ngẫu nhiên, là không khả thi. Mảng |
| 29 | +có độ tương phản cache tốt hơn so với danh sách liên kết. |
| 30 | + |
| 31 | + |
| 32 | +*Được làm từ [okso.app](https://okso.app)* |
| 33 | + |
| 34 | +## Mã giải (Pseudocode) cho Các Hoạt Động Cơ Bản |
| 35 | +*head = đầu, |
| 36 | +*tail = đuôi, |
| 37 | +*next = kế tiếp, |
| 38 | +*node = nút, |
| 39 | +*value = giá trị |
| 40 | + |
| 41 | +### Chèn (Insert) |
| 42 | + |
| 43 | +``` |
| 44 | +ThêmGiáTrị(giá trị) (Add(value)) |
| 45 | +Trước(Pre): giá trị là giá trị muốn thêm vào danh sách |
| 46 | +Sau(Post): giá trị đã được đặt ở cuối danh sách |
| 47 | +
|
| 48 | +n ← node(value) |
| 49 | +if head = ø |
| 50 | +head ← n |
| 51 | +tail ← n |
| 52 | +else |
| 53 | +tail.next ← n |
| 54 | +tail ← n |
| 55 | +end if |
| 56 | +end ThêmGiáTrị(Add) |
| 57 | +``` |
| 58 | + |
| 59 | +``` |
| 60 | +ChènVàoĐầu(giá trị) |
| 61 | +Trước(Pre): giá trị là giá trị muốn thêm vào danh sách |
| 62 | +Sau(Post): giá trị đã được đặt ở đầu danh sách |
| 63 | +
|
| 64 | +n ← node(value) |
| 65 | +n.next ← head |
| 66 | +head ← n |
| 67 | +if tail = ø |
| 68 | +tail ← n |
| 69 | +end |
| 70 | +end ChènVàoĐầu |
| 71 | +``` |
| 72 | + |
| 73 | +### Tìm Kiếm (Search) |
| 74 | +``` |
| 75 | +Chứa(đầu, giá trị) |
| 76 | +Trước: đầu là nút đầu trong danh sách |
| 77 | +giá trị là giá trị cần tìm kiếm |
| 78 | +Sau: mục đó có thể ở trong danh sách liên kết, true; nếu không, là false |
| 79 | +n ← head |
| 80 | +while n != ø and n.value != value |
| 81 | +n ← n.next |
| 82 | +end while |
| 83 | +if n = ø |
| 84 | +return false |
| 85 | +end if |
| 86 | +return true |
| 87 | +end Contains |
| 88 | +``` |
| 89 | + |
| 90 | +### Xóa (Delete) |
| 91 | +``` |
| 92 | +Xóa(đầu, giá trị) |
| 93 | +Trước: đầu là nút đầu trong danh sách |
| 94 | +giá trị là giá trị cần xóa khỏi danh sách |
| 95 | +Sau: giá trị đã được xóa khỏi danh sách, true; nếu không, là false |
| 96 | +if head = ø |
| 97 | +return false |
| 98 | +end if |
| 99 | +n ← head |
| 100 | +if n.value = value |
| 101 | +if head = tail |
| 102 | +head ← ø |
| 103 | +tail ← ø |
| 104 | +else |
| 105 | +head ← head.next |
| 106 | +end if |
| 107 | +return true |
| 108 | +end if |
| 109 | +while n.next != ø and n.next.value != value |
| 110 | +n ← n.next |
| 111 | +end while |
| 112 | +if n.next != ø |
| 113 | +if n.next = tail |
| 114 | +tail ← n |
| 115 | +tail.next = null |
| 116 | +else |
| 117 | +n.next ← n.next.next |
| 118 | +end if |
| 119 | +return true |
| 120 | +end if |
| 121 | +return false |
| 122 | +end Remove |
| 123 | +``` |
| 124 | + |
| 125 | +### Duyệt(raverse) |
| 126 | +Duyệt(đầu) |
| 127 | +Trước: đầu là nút đầu trong danh sách |
| 128 | +Sau: các mục trong danh sách đã được duyệt |
| 129 | +n ← head |
| 130 | +while n != ø |
| 131 | +yield n.value |
| 132 | +n ← n.next |
| 133 | +end while |
| 134 | +end Traverse |
| 135 | + |
| 136 | +### Duyệt Ngược (Traverse in Reverse) |
| 137 | +DuyệtNgược(đầu, đuôi) |
| 138 | +Trước: đầu và đuôi thuộc cùng một danh sách |
| 139 | +Sau: các mục trong danh sách đã được duyệt theo thứ tự ngược lại |
| 140 | + |
| 141 | +## Độ Phức Tạp |
| 142 | + |
| 143 | +### Độ Phức Tạp Thời Gian (Time Complexity) |
| 144 | + |
| 145 | +| Access | Search | Insertion | Deletion | |
| 146 | +| :-------: | :-------: | :-------: | :-------: | |
| 147 | +| O(n) | O(n) | O(1) | O(n) | |
| 148 | + |
| 149 | +## Độ Phức Tạp Không Gian (Space Complexity) |
| 150 | +O(n) |
| 151 | + |
| 152 | +## Tham Khảo |
| 153 | + |
| 154 | +- [Wikipedia](https://en.wikipedia.org/wiki/Linked_list) |
| 155 | +- [YouTube](https://www.youtube.com/watch?v=njTh_OwMljA&index=2&t=1s&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8) |
0 commit comments