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ảngHạ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ếtBiể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 node 0
C++
// A linked list node 1 Node {
// A linked list node 3____04
int data;
Node* next;
// A linked list node 0
Java
// A linked list node 1 struct 2
struct 4struct 5
struct 7
// A linked list node 1 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
8int 1____42int 3
Node { 1int 5
int 5
int 5
con trăn
int 9
// A linked list node 1 data; 1
data; 3
data; 5 data; 6data; 7data; 8
Node { 1data; 7 1 2 3 4
Node { 1_______57____37 8 2 struct 0 struct 1
Node { 1struct 3
struct 4
// A linked list node 1 struct 6
struct 8
Node* next; 0
data; 5 data; 6data; 7Node* next; 5
Node { 1data; 7Node* next; 8 2 struct 0
C#
// A linked list node 1 struct 2
// A linked list node 04
// A linked list node 06
struct 4
// A linked list node 1 Node {
Node { 1int data;
Node { 1Node { 5
Node { 1Node { 7
Node { 1____33int // A linked list node 22
int 5
int 5
Javascript
// A linked list node 26
// A linked list node 27 // A linked list node 28struct 5
struct 7
// A linked list node 32
7
// A linked list node 36Node { 7
Node { 1Node { 9
Node { 1 1
Node { 1// A linked list node 43
________ 38 ________ 045 ________ 046 8// A linked list node 45// A linked list node 49int 2int 3
Node { 1int 5
int 5
// A linked list node 56
// A linked list node 57
Xây dựng danh sách liên kết đơn giản có 3 nútDuyệt qua một danh sách được liên kếtTrong 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ápC
// A linked list node 58
// A linked list node 59
// A linked list node 60
// A linked list node 61
struct Node {
int data;
struct Node* next;
// A linked list node 0
// A linked list node 71
// A linked list node 72
// A linked list node 73 // A linked list node 74struct // A linked list node 76
7
// A linked list node 79 // A linked list node 80
Node { 1____082____083// A linked list node 84// A linked list node 85
Node { 1// A linked list node 87
int 5
int 5
// A linked list node 91
int // A linked list node 93
7
struct // A linked list node 97
struct struct 00
struct struct 03
struct 05
struct 07struct struct 09struct 10// A linked list node 83struct 12// A linked list node 83struct struct 15
struct 17struct struct 09struct 10// A linked list node 83struct 12// A linked list node 83struct struct 15
struct 27struct struct 09struct 10// A linked list node 83struct 12// A linked list node 83struct struct 15
ListNode có nghĩa là gì trong Python?
ListNode không phải là lớp python chung. Nó được định nghĩa là cái trong tiêu đề đã nhận xét của mã của bạn .
Sự khác biệt giữa danh sách và ListNode là gì?
ListNode là một nút trong danh sách liên kết. SingleList là danh sách được liên kết . Để rút ra một sự tương tự - một nút là một liên kết trong một chuỗi; .
Loại ListNode là gì?
Đây là nút dành cho danh sách liên kết đơn, có khả năng chứa một loại Đối tượng . Một ListNode bao gồm hai thành viên dữ liệu. Dữ liệu chúng tôi đang theo dõi tại nút này (Đối tượng) ListNode tiếp theo trong chuỗi.
ListNode tùy chọn có nghĩa là gì trong Python?
Đó là cho phép các giá trị có thể là Không có . Ví dụ. Đây là tất cả các nút danh sách. (3 -> 1 -> Không) Ví dụ. # Sử dụng Tùy chọn [] cho các giá trị có thể là Không có x. Tùy chọn[str] = some_function() |