Giống như mảng, Danh sách liên kết là một cấu trúc dữ liệu tuyến tính. Không giống như mảng, các phần tử danh sách được liên kết không được lưu trữ tại một vị trí liền kề; . Chúng bao gồm một loạt các nút được kết nối. Tại đây, mỗi nút lưu trữ dữ liệu và địa chỉ của nút tiếp theo
Danh sách liên kết
Tại sao danh sách liên kết?
Mảng có thể được sử dụng để lưu trữ dữ liệu tuyến tính của các loại tương tự, nhưng mảng có những hạn chế sau
- Kích thước của các mảng là cố định. Vì vậy chúng ta phải biết trước giới hạn trên của số phần tử. Ngoài ra, nói chung, bộ nhớ được phân bổ bằng giới hạn trên bất kể mức sử dụng.
- Chèn một phần tử mới/Xóa một phần tử hiện có trong một mảng các phần tử rất tốn kém. Phòng phải được tạo cho các phần tử mới và để tạo phòng các phần tử hiện có phải được dịch chuyển nhưng trong Danh sách được liên kết nếu chúng ta có nút đầu thì chúng ta có thể đi qua bất kỳ nút nào thông qua nút đó và chèn nút mới vào vị trí cần thiết
Ví dụ.
Trong một hệ thống, nếu chúng ta duy trì một danh sách ID được sắp xếp trong một mảng id[] = [1000, 1010, 1050, 2000, 2040].
Nếu muốn chèn ID mới 1005 thì để giữ nguyên thứ tự đã sắp xếp ta phải di chuyển tất cả các phần tử sau 1000 (trừ 1000).Việc xóa mảng cũng tốn kém trừ khi sử dụng một số kỹ thuật đặc biệt. Ví dụ: để xóa 1010 trong id[], mọi thứ sau 1010 phải được di chuyển do có quá nhiều công việc đang được thực hiện ảnh hưởng đến hiệu quả của mã
Ưu điểm của Danh sách liên kết so với mảng
- Mảng động
- Dễ Chèn/Xóa
Hạn chế của danh sách liên kết.
- Truy cập ngẫu nhiên không được phép. Chúng ta phải truy cập các phần tử một cách tuần tự bắt đầu từ nút đầu tiên (nút đầu). Vì vậy, chúng tôi không thể thực hiện tìm kiếm nhị phân với các danh sách được liên kết một cách hiệu quả với cách triển khai mặc định của nó.
- Không gian bộ nhớ bổ sung cho một con trỏ được yêu cầu với mỗi phần tử của danh sách.
- Không thân thiện với bộ đệm. Vì các phần tử mảng là các vị trí liền kề, nên có vị trí tham chiếu không có trong trường hợp danh sách được liên kết
- Mất nhiều thời gian duyệt và thay đổi con trỏ
- Không thể duyệt ngược trong danh sách liên kết đơn
- Sẽ rất khó hiểu khi chúng ta làm việc với con trỏ
- Không thể truy cập trực tiếp vào một phần tử trong danh sách được liên kết như trong một mảng theo chỉ mục
- Tìm kiếm một phần tử rất tốn kém và yêu cầu độ phức tạp thời gian O(n)
- Việc sắp xếp danh sách liên kết rất phức tạp và tốn kém
Các loại danh sách liên kết
- Danh sách được liên kết đơn giản – Trong loại danh sách được liên kết này, người ta có thể di chuyển hoặc duyệt danh sách được liên kết theo một hướng duy nhất. Nó còn được gọi là “Danh sách liên kết đơn”
- Danh sách liên kết kép – Trong loại danh sách được liên kết này, người ta có thể di chuyển hoặc duyệt qua danh sách được liên kết theo cả hai hướng (Tiến và Lùi)
- Danh sách liên kết tròn – Trong loại danh sách được liên kết này, nút cuối cùng của danh sách được liên kết chứa liên kết của nút đầu tiên/nút đầu của danh sách được liên kết trong con trỏ tiếp theo của nó và nút đầu tiên/nút đầu chứa liên kết của nút cuối cùng của danh sách được liên kết.
- Danh sách liên kết vòng đôi – Danh sách liên kết vòng đôi hoặc danh sách liên kết hai chiều vòng là một loại danh sách liên kết phức tạp hơn có chứa một con trỏ tới nút tiếp theo cũng như nút trước đó trong chuỗi. Sự khác nhau giữa danh sách kép liên kết kép và danh sách kép vòng cũng giống như sự khác biệt giữa danh sách liên kết đơn và danh sách liên kết vòng. Danh sách liên kết đôi vòng không chứa null trong trường trước đó của nút đầu tiên
- Danh sách liên kết tiêu đề – Danh sách liên kết tiêu đề là một loại danh sách liên kết đặc biệt có chứa nút tiêu đề ở đầu danh sách.
Các thao tác cơ bản trên Danh sách liên kết
- xóa
- Chèn
- Tìm kiếm
- Trưng bày
Biểu diễn danh sách liên kết đơn.
Một danh sách được liên kết được biểu diễn bằng một con trỏ tới nút đầu tiên của danh sách được liên kết. Nút đầu tiên được gọi là nút đầu của danh sách liên kết. Nếu danh sách liên kết rỗng thì giá trị của phần đầu trỏ tới NULL.
Mỗi nút trong danh sách bao gồm ít nhất hai phần.
- Một Mục dữ liệu (chúng tôi có thể lưu trữ số nguyên, chuỗi hoặc bất kỳ loại dữ liệu nào)
- Con trỏ (Hoặc Tham chiếu) tới nút tiếp theo (kết nối nút này với nút khác) hoặc Địa chỉ của nút khác
Trong C, chúng ta có thể biểu diễn một nút bằng các cấu trúc. Dưới đây là một ví dụ về nút danh sách được liên kết với dữ liệu số nguyên.
Trong Java hoặc C#, LinkedList có thể được biểu diễn dưới dạng một lớp và Nút dưới dạng một lớp riêng biệt. Lớp LinkedList chứa tham chiếu của loại lớp Node.
C
// A linked list node
struct Node {
int data;
struct Node* next;
// A linked list node0
C++
// A linked list node1 Node {
// A linked list node3____04
int data;
Node* next;
// A linked list node0
Java
// A linked list node1 struct2
struct4struct5
struct7
// A linked list node1 Node {
Node {1int data;
Node {1Node {5
Node {1Node {7
Node {1Node {9
Node {1 1
Node {1____33int 5
Node {1 7
8 9
8int1____42int3
Node {1int5
int5
int5
con trăn
int9
// A linked list node1 data;1
data;3
data;5 data;6data;7data;8
Node {1data;7 1 2 3 4
Node {1_______57____37 8 2 struct0 struct1
Node {1struct3
struct4
// A linked list node1 struct6
struct8
Node* next;0
data;5 data;6data;7Node* next;5
Node {1data;7Node* next;8 2 struct0
C#
// A linked list node1 struct2
// A linked list node04
// A linked list node06
struct4
// A linked list node1 Node {
Node {1int data;
Node {1Node {5
Node {1Node {7
Node {1____33int // A linked list node22
int5
int5
Javascript
// A linked list node26
// A linked list node27 // A linked list node28struct5
struct7
// A linked list node32
7
// A linked list node36Node {7
Node {1Node {9
Node {1 1
Node {1// A linked list node43
________ 38 ________ 045 ________ 046
8// A linked list node45// A linked list node49int2int3
Node {1int5
int5
// A linked list node56
// A linked list node57
Xây dựng danh sách liên kết đơn giản có 3 nút
Duyệt qua một danh sách được liên kết
Trong chương trình trước, chúng ta đã tạo một danh sách liên kết đơn giản với ba nút. Hãy để chúng tôi duyệt qua danh sách đã tạo và in dữ liệu của từng nút. Để truyền tải, chúng ta hãy viết một hàm đa năng printList() để in bất kỳ danh sách đã cho nào
Chúng tôi thực sự khuyên bạn nên nhấp vào đây và thực hành trước khi chuyển sang giải pháp
C
// A linked list node58
// A linked list node59
// A linked list node60
// A linked list node61
struct Node {
int data;
struct Node* next;
// A linked list node0
// A linked list node71
// A linked list node72
// A linked list node73 // A linked list node74struct // A linked list node76
7
// A linked list node79 // A linked list node80
Node {1____082____083// A linked list node84// A linked list node85
Node {1// A linked list node87
int5
int5
// A linked list node91
int // A linked list node93
7
struct // A linked list node97
struct struct00
struct struct03
struct05
struct07struct struct09struct10// A linked list node83struct12// A linked list node83struct struct15
struct17struct struct09struct10// A linked list node83struct12// A linked list node83struct struct15
struct27struct struct09struct10// A linked list node83struct12// A linked list node83struct struct15