Danh sách được liên kết là một cấu trúc dữ liệu tuyến tính trong đó các phần tử không được lưu trữ cạnh nhau trong bộ nhớ. Khác với mảng, các phần tử trong danh sách liên kết sử dụng con trỏ hoặc tham chiếu đến nhau để giữ nguyên danh sách
Giống như mảng hoặc danh sách truyền thống, danh sách được liên kết là một tập hợp các đối tượng được sắp xếp theo thứ tự. Danh sách được liên kết khác với danh sách ở chỗ chúng lưu trữ các phần tử trong bộ nhớ. Trong khi các danh sách thông thường như mảng và lát sử dụng khối bộ nhớ liền kề để lưu trữ tham chiếu đến dữ liệu của chúng, danh sách được liên kết lưu trữ tham chiếu hoặc con trỏ như một phần của mỗi phần tử
nguồn
Một danh sách bình thường chỉ là một con trỏ tới phần tử đầu tiên trong danh sách và một mục cụ thể có thể được truy xuất bằng cách cung cấp một phần bù bộ nhớ
Một danh sách được liên kết cũng chỉ là một con trỏ tới phần tử đầu tiên trong danh sách, nhưng bù đắp bộ nhớ sẽ không giúp ích gì cho chúng ta. Chúng ta cần kiểm tra các yếu tố đầu tiên của con trỏ ________ 21 để xem vị trí của mục tiếp theo, sau đó chúng ta có thể điều hướng đến mục đó. Từ đó, chúng ta có thể tìm mục tiếp theo, v.v.
Ví dụ về danh sách liên kết đơn trong Python 🔗
Lớp nút 🔗
Đầu tiên, chúng ta sẽ xây dựng một lớp
class LinkedList:
def __init__[self]:
self.head = None
2. Lớp class LinkedList:
def __init__[self]:
self.head = None
0 mà chúng tôi xây dựng cuối cùng sẽ là một danh sách của class LinkedList:
def __init__[self]:
self.head = None
2class Node:
def __init__[self, val]:
self.val = val
self.next = None
def set_next[self, node]:
self.next = node
def __repr__[self]:
return self.val
Mỗi nút có một thành viên dữ liệu
class LinkedList:
def __init__[self]:
self.head = None
2 [thông tin mà nó lưu trữ] và một thành viên dữ liệu class LinkedList:
def __init__[self]:
self.head = None
1. Thành viên dữ liệu class LinkedList:
def __init__[self]:
self.head = None
1 chỉ trỏ tới class LinkedList:
def __init__[self]:
self.head = None
2 tiếp theo trong danh sách nếu có, nếu không, đó là class LinkedList:
def __init__[self]:
self.head = None
6Trình tạo danh sách được liên kết 🔗
class LinkedList:
def __init__[self]:
self.head = None
Hàm tạo rất dễ dàng - chỉ cần khởi tạo một con trỏ
class LinkedList:
def __init__[self]:
self.head = None
7 trống. Điều này cho thấy chúng tôi hiện có một danh sách trốngLặp lại danh sách 🔗
Hãy làm cho việc lặp qua từng mục trong danh sách trở nên dễ dàng bằng cách sử dụng cú pháp
class LinkedList:
def __init__[self]:
self.head = None
8 của Pythondef __iter__[self]:
node = self.head
while node is not None:
yield node
node = node.next
Bằng cách triển khai phương thức
class LinkedList:
def __init__[self]:
self.head = None
9 của Python, giờ đây chúng ta có thể sử dụng cú pháp lặp. Ví dụ, def __iter__[self]:
node = self.head
while node is not None:
yield node
node = node.next
0Đang thêm vào danh sách liên kết 🔗
Hãy tạo một cách để thêm các mục vào đuôi danh sách, phương thức
def __iter__[self]:
node = self.head
while node is not None:
yield node
node = node.next
1. Nó lấy một nút làm đầu vào, lặp lại trên toàn bộ danh sách, sau đó thêm nút đã cho vào cuốiclass Node:
def __init__[self, val]:
self.val = val
self.next = None
def set_next[self, node]:
self.next = node
def __repr__[self]:
return self.val
1Đang xóa khỏi danh sách liên kết 🔗
Có nhiều cách khác để xóa các mục khỏi danh sách, nhưng bây giờ, và để làm ví dụ, hãy viết một phương thức
def __iter__[self]:
node = self.head
while node is not None:
yield node
node = node.next
2class Node:
def __init__[self, val]:
self.val = val
self.next = None
def set_next[self, node]:
self.next = node
def __repr__[self]:
return self.val
3def __iter__[self]:
node = self.head
while node is not None:
yield node
node = node.next
3 xóa và trả về mục đầu tiên khỏi danh sách, giả sử có một mụcIn danh sách liên kết 🔗
Cuối cùng nhưng không kém phần quan trọng, chúng ta có thể triển khai phương thức
def __iter__[self]:
node = self.head
while node is not None:
yield node
node = node.next
4 của Python để có thể gọi trực tiếp def __iter__[self]:
node = self.head
while node is not None:
yield node
node = node.next
5 trên một danh sách và kiểm soát những gì nó in ra. Đây là một đại diện tôi thíchclass Node:
def __init__[self, val]:
self.val = val
self.next = None
def set_next[self, node]:
self.next = node
def __repr__[self]:
return self.val
7Phương thức này sẽ in giá trị của từng nút theo thứ tự, với các mũi tên ở giữa. Ví dụ,
def __iter__[self]:
node = self.head
while node is not None:
yield node
node = node.next
6Sử dụng danh sách liên kết 🔗
class Node:
def __init__[self, val]:
self.val = val
self.next = None
def set_next[self, node]:
self.next = node
def __repr__[self]:
return self.val
9Các danh sách được liên kết có giá trị vô cùng lớn trong khoa học máy tính vì chúng cho phép chúng ta thêm và xóa các phần tử ở bất kỳ đâu trong danh sách một cách nhanh chóng, với độ phức tạp Big-O chỉ là
def __iter__[self]:
node = self.head
while node is not None:
yield node
node = node.next
7Độ phức tạp Big-O của danh sách liên kết 🔗
Hoạt động Độ phức tạp của Big-OChènO[1]XóaO[1]Chỉ mụcO[n]
Do các hoạt động nhanh chóng, danh sách được liên kết được sử dụng thực tế trong nhiều tình huống khác nhau, bao gồm