33 LinkedList

Trong lập trình C#, LinkedList<T> là một cấu trúc dữ liệu thuộc loại danh sách liên kết kép, nơi mỗi phần tử được gọi là một nút (node). Mỗi nút chứa dữ liệu và hai tham chiếu: một trỏ đến nút trước đó và một trỏ đến nút tiếp theo. Điều này cho phép duyệt qua danh sách theo cả hai chiều, từ đầu đến cuối và ngược lại.

1. Khởi tạo LinkedList

Để sử dụng LinkedList, bạn cần nạp namespace System.Collections.Generic:

using System.Collections.Generic;

Bạn có thể khởi tạo một danh sách liên kết với kiểu dữ liệu cụ thể như sau:

LinkedList<string> danhSach = new LinkedList<string>();

Trong ví dụ này, danhSach là một danh sách liên kết chứa các chuỗi ký tự.

2. Thao tác với LinkedList

a. Thêm phần tử

  • Thêm vào đầu danh sách:
danhSach.AddFirst("Phần tử đầu");
  • Thêm vào cuối danh sách:
danhSach.AddLast("Phần tử cuối");
  • Thêm sau một nút cụ thể:
LinkedListNode<string> node = danhSach.Find("Phần tử đầu");
if (node != null)
{
    danhSach.AddAfter(node, "Phần tử sau");
}
  • Thêm trước một nút cụ thể:
LinkedListNode<string> node = danhSach.Find("Phần tử cuối");
if (node != null)
{
    danhSach.AddBefore(node, "Phần tử trước");
}

b. Xóa phần tử

  • Xóa nút đầu tiên:
danhSach.RemoveFirst();
  • Xóa nút cuối cùng:
danhSach.RemoveLast();
  • Xóa một nút với giá trị cụ thể:
danhSach.Remove("Phần tử cần xóa");

c. Duyệt qua các phần tử

Bạn có thể sử dụng vòng lặp foreach để duyệt qua các phần tử trong danh sách:

foreach (string item in danhSach)
{
    Console.WriteLine(item);
}

d. Kiểm tra sự tồn tại của phần tử

Để kiểm tra xem một giá trị có tồn tại trong danh sách hay không:

bool tonTai = danhSach.Contains("Giá trị cần kiểm tra");

3. Các thuộc tính và phương thức quan trọng

  • Count: Trả về số lượng nút trong danh sách.
int soLuong = danhSach.Count;
  • First: Trả về nút đầu tiên của danh sách.
LinkedListNode<string> nutDau = danhSach.First;
  • Last: Trả về nút cuối cùng của danh sách.
LinkedListNode<string> nutCuoi = danhSach.Last;

4. Lưu ý khi sử dụng LinkedList

  • Hiệu suất: Việc thêm hoặc xóa phần tử ở đầu hoặc cuối danh sách liên kết có hiệu suất cao, nhưng truy cập phần tử theo chỉ số sẽ chậm hơn so với mảng hoặc List<T>.
  • Sử dụng phù hợp: LinkedList hữu ích khi bạn cần thường xuyên thêm hoặc xóa phần tử ở đầu hoặc cuối danh sách, hoặc khi cần duyệt qua danh sách theo cả hai chiều.

5. Mục đích sử dụng LinkedList

LinkedList trong C# phù hợp cho các tình huống đặc thù, nơi bạn cần quản lý danh sách các phần tử với các yêu cầu như:


a. Thêm và xóa phần tử nhanh ở đầu hoặc cuối danh sách

  • Với LinkedList, bạn có thể thêm hoặc xóa phần tử ở đầu (AddFirst/RemoveFirst) hoặc cuối (AddLast/RemoveLast) một cách nhanh chóng mà không cần dời các phần tử khác, nhờ vào cấu trúc liên kết.
  • Ví dụ ứng dụng:
    • Quản lý hàng đợi (queue) hoặc ngăn xếp (stack) với các thao tác thêm/xóa linh hoạt.
    • Xây dựng thuật toán cần thao tác nhanh trên đầu hoặc cuối danh sách, chẳng hạn như duyệt theo cấp độ trong cây nhị phân.

b. Không cần truy cập phần tử theo chỉ số

  • LinkedList không hỗ trợ truy cập ngẫu nhiên (random access) theo chỉ số, nhưng cho phép duyệt qua từng nút. Điều này hữu ích trong các bài toán mà thứ tự phần tử không quan trọng, hoặc bạn không cần thao tác với vị trí cụ thể.
  • Ví dụ ứng dụng:
    • Triển khai danh sách động cho các thuật toán mà thứ tự xử lý phần tử không phụ thuộc vào chỉ số.

c. Thêm hoặc xóa phần tử tại vị trí bất kỳ

  • LinkedList cho phép thêm (AddBefore, AddAfter) và xóa phần tử tại các vị trí bất kỳ được xác định bởi LinkedListNode. Đây là một lợi thế so với List<T>, vì việc thêm/xóa giữa danh sách liên kết không yêu cầu dịch chuyển các phần tử khác.
  • Ví dụ ứng dụng:
    • Quản lý danh sách yêu cầu hoặc nhiệm vụ, nơi bạn cần thêm hoặc xóa các mục tại một vị trí cụ thể, chẳng hạn thêm yêu cầu ưu tiên.

d. Duyệt danh sách theo cả hai chiều

  • LinkedList là danh sách liên kết kép (doubly linked list), cho phép duyệt từ đầu đến cuối và ngược lại. Tính năng này hữu ích trong các thuật toán cần duyệt qua danh sách ở cả hai chiều.
  • Ví dụ ứng dụng:
    • Triển khai undo/redo trong trình soạn thảo văn bản.
    • Quản lý lịch sử trình duyệt web.

e. Khi hiệu suất thêm/xóa quan trọng hơn truy cập ngẫu nhiên

  • Nếu ứng dụng cần thao tác thêm hoặc xóa phần tử thường xuyên, nhưng không cần truy cập phần tử ngẫu nhiên theo chỉ số, LinkedList sẽ hiệu quả hơn so với List<T>.
  • Ví dụ ứng dụng:
    • Triển khai thuật toán sắp xếp hoặc lọc mà các phần tử cần được thêm vào danh sách một cách linh hoạt.

So sánh nhanh LinkedList và List

Đặc điểmLinkedList<T>List<T>
Thêm/xóa đầu/cuối danh sáchHiệu suất cao (O(1))Hiệu suất trung bình (O(n))
Thêm/xóa giữa danh sáchHiệu suất cao nếu đã có LinkedListNodePhải dời các phần tử khác (O(n))
Truy cập ngẫu nhiênKhông hỗ trợ (chỉ duyệt tuần tự)Hỗ trợ qua chỉ số (O(1))
Duyệt hai chiềuKhông
Ứng dụng phổ biếnThêm/xóa động, quản lý cấu trúc tuần tựTruy cập ngẫu nhiên, quản lý danh sách cố định
Để lại một bình luận 0

Your email address will not be published. Required fields are marked *