Hướng dẫn what are linked lists in python? - danh sách được liên kết trong python là gì?

Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem cùng với hướng dẫn bằng văn bản để hiểu sâu hơn về sự hiểu biết của bạn: Làm việc với các danh sách được liên kết trong Python This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Working With Linked Lists in Python

Show

Danh sách được liên kết giống như một người anh em họ ít được biết đến của danh sách. Họ không phổ biến hoặc tuyệt vời, và bạn thậm chí có thể không nhớ chúng từ lớp thuật toán của bạn. Nhưng trong bối cảnh đúng đắn, họ thực sự có thể tỏa sáng. are like a lesser-known cousin of lists. They’re not as popular or as cool, and you might not even remember them from your algorithms class. But in the right context, they can really shine.

Trong bài viết này, bạn sẽ học:

  • Danh sách được liên kết là gì và khi nào bạn nên sử dụng chúng
  • Cách sử dụng
    >>> deque(['a','b','c'])
    deque(['a', 'b', 'c'])
    
    >>> deque('abc')
    deque(['a', 'b', 'c'])
    
    >>> deque([{'data': 'a'}, {'data': 'b'}])
    deque([{'data': 'a'}, {'data': 'b'}])
    
    9 cho tất cả các nhu cầu danh sách được liên kết của bạn
  • Cách thực hiện danh sách được liên kết của riêng bạn
  • Các loại danh sách được liên kết khác là gì và những gì chúng có thể được sử dụng cho

Nếu bạn đang tìm cách cải thiện các kỹ năng mã hóa của mình để phỏng vấn xin việc hoặc nếu bạn muốn tìm hiểu thêm về các cấu trúc dữ liệu Python bên cạnh các từ điển và danh sách thông thường, thì bạn đã đến đúng nơi!

Bạn có thể làm theo cùng với các ví dụ trong hướng dẫn này bằng cách tải xuống mã nguồn có sẵn tại liên kết bên dưới:

Hiểu danh sách liên kết

Danh sách được liên kết là một bộ sưu tập các đối tượng được đặt hàng. Vậy điều gì làm cho chúng khác với danh sách bình thường? Danh sách được liên kết khác với danh sách theo cách chúng lưu trữ các yếu tố trong bộ nhớ. Mặc dù danh sách sử dụng một khối bộ nhớ liên tục để lưu trữ các tham chiếu đến dữ liệu của họ, danh sách được liên kết lưu trữ các tài liệu tham khảo như một phần của các yếu tố của riêng họ.

Khái niệm chính

Trước khi đi sâu hơn vào danh sách được liên kết là gì và cách bạn có thể sử dụng chúng, trước tiên bạn nên tìm hiểu cách chúng được cấu trúc. Mỗi yếu tố của một danh sách được liên kết được gọi là một nút và mỗi nút có hai trường khác nhau:node, and every node has two different fields:

  1. Dữ liệu chứa giá trị được lưu trữ trong nút. contains the value to be stored in the node.
  2. Tiếp theo chứa một tham chiếu đến nút tiếp theo trong danh sách. contains a reference to the next node on the list.

Ở đây, những gì một nút điển hình trông như thế nào:

Hướng dẫn what are linked lists in python? - danh sách được liên kết trong python là gì?
Nút

Một danh sách được liên kết là một tập hợp các nút. Nút đầu tiên được gọi là

>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
0 và nó được sử dụng làm điểm bắt đầu cho bất kỳ lần lặp nào thông qua danh sách. Nút cuối cùng phải có tham chiếu
>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
1 trỏ đến
>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
2 để xác định kết thúc của danh sách. Ở đây, nó trông như thế nào:
>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
0
, and it’s used as the starting point for any iteration through the list. The last node must have its
>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
1 reference pointing to
>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
2 to determine the end of the list. Here’s how it looks:

Hướng dẫn what are linked lists in python? - danh sách được liên kết trong python là gì?
Danh sách liên kết

Bây giờ bạn đã biết làm thế nào một danh sách được liên kết được cấu trúc, bạn đã sẵn sàng để xem xét một số trường hợp sử dụng thực tế cho nó.

Ứng dụng thực tế

Danh sách liên kết phục vụ một loạt các mục đích trong thế giới thực. Chúng có thể được sử dụng để thực hiện hàng đợi hoặc xếp hàng hoặc ngăn xếp cũng như đồ thị. Chúng cũng hữu ích cho các nhiệm vụ phức tạp hơn nhiều, chẳng hạn như quản lý vòng đời cho một ứng dụng hệ điều hành.

Hàng đợi hoặc ngăn xếp

Hàng đợi và ngăn xếp chỉ khác nhau trong cách truy xuất các yếu tố. Đối với hàng đợi, bạn sử dụng phương pháp đầu tiên/đầu tiên (FIFO). Điều đó có nghĩa là phần tử đầu tiên được chèn vào danh sách là phần đầu tiên được truy xuất:First-In/First-Out (FIFO) approach. That means that the first element inserted in the list is the first one to be retrieved:

Hướng dẫn what are linked lists in python? - danh sách được liên kết trong python là gì?
Xếp hàng

Trong sơ đồ trên, bạn có thể thấy các yếu tố phía trước và phía sau của hàng đợi. Khi bạn nối các yếu tố mới vào hàng đợi, họ sẽ đi đến phía sau. Khi bạn lấy các yếu tố, chúng sẽ được lấy từ phía trước hàng đợi.front and rear elements of the queue. When you append new elements to the queue, they’ll go to the rear end. When you retrieve elements, they’ll be taken from the front of the queue.

Đối với một ngăn xếp, bạn sử dụng cách tiếp cận cuối cùng/nắm tay (LIFO), có nghĩa là phần tử cuối cùng được chèn vào danh sách là lần đầu tiên được truy xuất:Last-In/Fist-Out (LIFO) approach, meaning that the last element inserted in the list is the first to be retrieved:

Hướng dẫn what are linked lists in python? - danh sách được liên kết trong python là gì?
Cây rơm

Trong sơ đồ trên, bạn có thể thấy rằng phần tử đầu tiên được chèn trên ngăn xếp (INDEX

>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
3) ở phía dưới và phần tử cuối cùng được chèn ở trên cùng. Vì các ngăn xếp sử dụng phương pháp LIFO, phần tử cuối cùng được chèn (ở trên cùng) sẽ là phần đầu tiên được truy xuất.

Do cách bạn chèn và truy xuất các phần tử từ các cạnh của hàng đợi và ngăn xếp, danh sách được liên kết là một trong những cách thuận tiện nhất để thực hiện các cấu trúc dữ liệu này. Bạn sẽ thấy các ví dụ về các triển khai này sau trong bài viết.

Đồ thị

Đồ thị có thể được sử dụng để hiển thị mối quan hệ giữa các đối tượng hoặc để biểu thị các loại mạng khác nhau. Ví dụ: biểu diễn trực quan của biểu đồ, nói rằng biểu đồ acyclic được định hướng (DAG) trông giống như thế này:

Hướng dẫn what are linked lists in python? - danh sách được liên kết trong python là gì?
Đồ thị acyclic định hướng

Có nhiều cách khác nhau để thực hiện các biểu đồ như trên, nhưng một trong những cách phổ biến nhất là sử dụng danh sách kề. Về bản chất, một danh sách kề kề là một danh sách các danh sách được liên kết trong đó mỗi đỉnh của biểu đồ được lưu trữ cùng với một bộ sưu tập các đỉnh được kết nối:adjacency list. An adjacency list is, in essence, a list of linked lists where each vertex of the graph is stored alongside a collection of connected vertices:

ĐỉnhDanh sách các đỉnh được liên kết
1 2 → 3 → không có
2 4 → Không có
3 Không có
4 5 → 6 → không có
5 6 → Không có
6 Không có

5 → 6 → không có

6 → Không có

>>> graph = {
...     1: [2, 3, None],
...     2: [4, None],
...     3: [None],
...     4: [5, 6, None],
...     5: [6, None],
...     6: [None]
... }

Trong bảng trên, mỗi đỉnh của biểu đồ của bạn được liệt kê trong cột bên trái. Cột bên phải chứa một loạt các danh sách được liên kết lưu trữ các đỉnh khác được kết nối với đỉnh tương ứng ở cột bên trái. Danh sách kề này cũng có thể được biểu diễn trong mã bằng cách sử dụng

>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
4:

>>>adjacency matrix. That’s why linked lists are so useful for graph implementation.

So sánh hiệu suất: Danh sách VS Danh sách được liên kết

Trong hầu hết các ngôn ngữ lập trình, có sự khác biệt rõ ràng trong cách các danh sách và mảng được liên kết được lưu trữ trong bộ nhớ. Tuy nhiên, trong Python, danh sách là các mảng động. Điều đó có nghĩa là việc sử dụng bộ nhớ của cả danh sách và danh sách được liên kết là rất giống nhau.

Vì sự khác biệt trong việc sử dụng bộ nhớ giữa các danh sách và danh sách được liên kết là không đáng kể, nên nó tốt hơn nếu bạn tập trung vào sự khác biệt về hiệu suất của chúng khi nói đến độ phức tạp về thời gian.

Chèn và xóa các yếu tố

Trong Python, bạn có thể chèn các phần tử vào danh sách bằng cách sử dụng

>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
5 hoặc
>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
6. Để loại bỏ các yếu tố khỏi danh sách, bạn có thể sử dụng các đối tác của họ:
>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
7 và
>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
8.

Sự khác biệt chính giữa các phương pháp này là bạn sử dụng

>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
5 và
>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
7 để chèn hoặc xóa các phần tử ở một vị trí cụ thể trong danh sách, nhưng bạn sử dụng
>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
6 và
>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
8 chỉ để chèn hoặc xóa các phần tử ở cuối danh sách.

Bây giờ, một cái gì đó bạn cần biết về danh sách Python là việc chèn hoặc loại bỏ các yếu tố không ở cuối danh sách đòi hỏi một số yếu tố thay đổi trong nền, làm cho hoạt động phức tạp hơn về thời gian. Bạn có thể đọc bài viết được đề cập ở trên về cách các danh sách được triển khai trong Python để hiểu rõ hơn về cách thực hiện

>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
5,
>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
7,
>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
6 và
>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
8 ảnh hưởng đến hiệu suất của chúng.

Với tất cả điều này trong tâm trí, mặc dù việc chèn các phần tử ở cuối danh sách bằng cách sử dụng

>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
6 hoặc
>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
5 sẽ có thời gian không đổi, O (1), khi bạn thử chèn một phần tử gần hơn hoặc ở đầu danh sách, độ phức tạp thời gian trung bình sẽ phát triển cùng với kích thước của danh sách: O (n).

Mặt khác, các danh sách được liên kết đơn giản hơn nhiều khi chèn và xóa các yếu tố ở đầu hoặc cuối danh sách, trong đó độ phức tạp về thời gian của chúng luôn luôn không đổi: O (1).

Vì lý do này, các danh sách được liên kết có lợi thế về hiệu suất so với danh sách thông thường khi thực hiện hàng đợi (FIFO), trong đó các yếu tố được chèn và xóa liên tục ở đầu danh sách. Nhưng chúng thực hiện tương tự như một danh sách khi thực hiện ngăn xếp (LIFO), trong đó các yếu tố được chèn và loại bỏ ở cuối danh sách.

Truy xuất các yếu tố

Khi nói đến Tra cứu phần tử, danh sách hoạt động tốt hơn nhiều so với danh sách được liên kết. Khi bạn biết bạn muốn truy cập yếu tố nào, danh sách có thể thực hiện thao tác này trong thời gian O (1). Cố gắng làm điều tương tự với một danh sách được liên kết sẽ mất O (n) vì bạn cần phải đi qua toàn bộ danh sách để tìm phần tử.

Tuy nhiên, khi tìm kiếm một yếu tố cụ thể, cả danh sách và danh sách được liên kết thực hiện rất giống nhau, với độ phức tạp về thời gian của O (n). Trong cả hai trường hợp, bạn cần lặp lại toàn bộ danh sách để tìm phần tử mà bạn đang tìm kiếm.

Giới thiệu >>> deque(['a','b','c']) deque(['a', 'b', 'c']) >>> deque('abc') deque(['a', 'b', 'c']) >>> deque([{'data': 'a'}, {'data': 'b'}]) deque([{'data': 'a'}, {'data': 'b'}]) 9

Trong Python, có một đối tượng cụ thể trong mô-đun

>>> from collections import deque
>>> queue = deque()
>>> queue
deque([])

>>> queue.append("Mary")
>>> queue.append("John")
>>> queue.append("Susan")
>>> queue
deque(['Mary', 'John', 'Susan'])
0 mà bạn có thể sử dụng cho các danh sách được liên kết gọi là deque (phát âm là bộ bài), viết tắt của hàng đợi hai kết thúc.deque (pronounced “deck”), which stands for double-ended queue.

>>> deque(['a','b','c'])
deque(['a', 'b', 'c'])

>>> deque('abc')
deque(['a', 'b', 'c'])

>>> deque([{'data': 'a'}, {'data': 'b'}])
deque([{'data': 'a'}, {'data': 'b'}])
9 sử dụng việc triển khai danh sách được liên kết trong đó bạn có thể truy cập, chèn hoặc xóa các phần tử từ đầu hoặc kết thúc danh sách với hiệu suất O (1) không đổi.

Cách sử dụng >>> deque(['a','b','c']) deque(['a', 'b', 'c']) >>> deque('abc') deque(['a', 'b', 'c']) >>> deque([{'data': 'a'}, {'data': 'b'}]) deque([{'data': 'a'}, {'data': 'b'}]) 9

Theo mặc định, có khá nhiều phương pháp với đối tượng

>>> from collections import deque
>>> queue = deque()
>>> queue
deque([])

>>> queue.append("Mary")
>>> queue.append("John")
>>> queue.append("Susan")
>>> queue
deque(['Mary', 'John', 'Susan'])
3. Tuy nhiên, trong bài viết này, bạn sẽ chỉ chạm vào một vài trong số chúng, chủ yếu là để thêm hoặc loại bỏ các yếu tố.

Đầu tiên, bạn cần tạo một danh sách được liên kết. Bạn có thể sử dụng đoạn mã sau để làm điều đó với

>>> from collections import deque
>>> queue = deque()
>>> queue
deque([])

>>> queue.append("Mary")
>>> queue.append("John")
>>> queue.append("Susan")
>>> queue
deque(['Mary', 'John', 'Susan'])
3:

>>>

>>> from collections import deque
>>> deque()
deque([])

Mã trên sẽ tạo ra một danh sách liên kết trống. Nếu bạn muốn điền nó tại Sáng tạo, thì bạn có thể cung cấp cho nó một lần nữa như đầu vào:iterable as input:

>>>

>>> deque(['a','b','c'])
deque(['a', 'b', 'c'])

>>> deque('abc')
deque(['a', 'b', 'c'])

>>> deque([{'data': 'a'}, {'data': 'b'}])
deque([{'data': 'a'}, {'data': 'b'}])

Mã trên sẽ tạo ra một danh sách liên kết trống. Nếu bạn muốn điền nó tại Sáng tạo, thì bạn có thể cung cấp cho nó một lần nữa như đầu vào:

Khi khởi tạo một đối tượng

>>> from collections import deque
>>> queue = deque()
>>> queue
deque([])

>>> queue.append("Mary")
>>> queue.append("John")
>>> queue.append("Susan")
>>> queue
deque(['Mary', 'John', 'Susan'])
3, bạn có thể chuyển bất kỳ thứ nào có thể sử dụng dưới dạng đầu vào, chẳng hạn như một chuỗi (cũng có thể lặp lại) hoặc danh sách các đối tượng.

>>>

>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

Mã trên sẽ tạo ra một danh sách liên kết trống. Nếu bạn muốn điền nó tại Sáng tạo, thì bạn có thể cung cấp cho nó một lần nữa như đầu vào:

>>>

>>> llist.appendleft("z")
>>> llist
deque(['z', 'a', 'b', 'c', 'd', 'e'])

>>> llist.popleft()
'z'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

Mã trên sẽ tạo ra một danh sách liên kết trống. Nếu bạn muốn điền nó tại Sáng tạo, thì bạn có thể cung cấp cho nó một lần nữa như đầu vào:

Khi khởi tạo một đối tượng >>> from collections import deque >>> queue = deque() >>> queue deque([]) >>> queue.append("Mary") >>> queue.append("John") >>> queue.append("Susan") >>> queue deque(['Mary', 'John', 'Susan']) 3, bạn có thể chuyển bất kỳ thứ nào có thể sử dụng dưới dạng đầu vào, chẳng hạn như một chuỗi (cũng có thể lặp lại) hoặc danh sách các đối tượng.

Bây giờ bạn đã biết cách tạo đối tượng

>>> from collections import deque
>>> queue = deque()
>>> queue
deque([])

>>> queue.append("Mary")
>>> queue.append("John")
>>> queue.append("Susan")
>>> queue
deque(['Mary', 'John', 'Susan'])
3, bạn có thể tương tác với nó bằng cách thêm hoặc loại bỏ các yếu tố. Bạn có thể tạo danh sách được liên kết
>>> from collections import deque
>>> queue = deque()
>>> queue
deque([])

>>> queue.append("Mary")
>>> queue.append("John")
>>> queue.append("Susan")
>>> queue
deque(['Mary', 'John', 'Susan'])
7 và thêm phần tử mới
>>> from collections import deque
>>> queue = deque()
>>> queue
deque([])

>>> queue.append("Mary")
>>> queue.append("John")
>>> queue.append("Susan")
>>> queue
deque(['Mary', 'John', 'Susan'])
8 như thế này:

Hàng đợi

Với hàng đợi, bạn muốn thêm các giá trị vào danh sách (

>>> queue.popleft()
'Mary'

>>> queue
deque(['John', 'Susan'])

>>> queue.popleft()
'John'

>>> queue
deque(['Susan'])
6) và khi thời gian đúng, bạn muốn xóa phần tử đã nằm trong danh sách dài nhất (
>>> queue.popleft()
'Mary'

>>> queue
deque(['John', 'Susan'])

>>> queue.popleft()
'John'

>>> queue
deque(['Susan'])
7). Ví dụ, hãy tưởng tượng một hàng đợi tại một nhà hàng hợp thời trang và được đặt đầy đủ. Nếu bạn đang cố gắng thực hiện một hệ thống công bằng cho khách, thì bạn sẽ bắt đầu bằng cách tạo một hàng đợi và thêm người khi họ đến:

>>>

>>> from collections import deque
>>> queue = deque()
>>> queue
deque([])

>>> queue.append("Mary")
>>> queue.append("John")
>>> queue.append("Susan")
>>> queue
deque(['Mary', 'John', 'Susan'])

Bây giờ bạn có Mary, John và Susan trong hàng đợi. Hãy nhớ rằng vì hàng đợi là FIFO, người đầu tiên tham gia hàng đợi nên là người đầu tiên ra ngoài.

Bây giờ hãy tưởng tượng một thời gian trôi qua và một vài bảng trở nên có sẵn. Ở giai đoạn này, bạn muốn loại bỏ mọi người khỏi hàng đợi theo đúng thứ tự. Đây là cách bạn sẽ làm điều đó:

>>>

>>> queue.popleft()
'Mary'

>>> queue
deque(['John', 'Susan'])

>>> queue.popleft()
'John'

>>> queue
deque(['Susan'])

Bây giờ bạn có Mary, John và Susan trong hàng đợi. Hãy nhớ rằng vì hàng đợi là FIFO, người đầu tiên tham gia hàng đợi nên là người đầu tiên ra ngoài.

Bây giờ hãy tưởng tượng một thời gian trôi qua và một vài bảng trở nên có sẵn. Ở giai đoạn này, bạn muốn loại bỏ mọi người khỏi hàng đợi theo đúng thứ tự. Đây là cách bạn sẽ làm điều đó:

Mỗi khi bạn gọi

>>> queue.popleft()
'Mary'

>>> queue
deque(['John', 'Susan'])

>>> queue.popleft()
'John'

>>> queue
deque(['Susan'])
8, bạn sẽ xóa phần tử đầu khỏi danh sách được liên kết, bắt chước một hàng đợi ngoài đời thực.

Ngăn xếp

  1. Điều gì sẽ xảy ra nếu bạn muốn tạo một ngăn xếp thay thế? Vâng, ý tưởng ít nhiều giống như với hàng đợi. Sự khác biệt duy nhất là ngăn xếp sử dụng phương pháp LIFO, có nghĩa là phần tử cuối cùng được chèn vào ngăn xếp phải là loại đầu tiên được loại bỏ.
  2. Hãy tưởng tượng bạn đang tạo ra một chức năng lịch sử của trình duyệt web, trong đó lưu trữ mỗi trang mà người dùng truy cập để họ có thể quay ngược thời gian một cách dễ dàng. Giả sử đây là những hành động mà người dùng ngẫu nhiên thực hiện trên trình duyệt của họ:
  3. Truy cập trang web thực sự của Python

Điều hướng đến Pandas: Cách đọc và ghi tệp

>>>

>>> from collections import deque
>>> history = deque()

>>> history.appendleft("https://realpython.com/")
>>> history.appendleft("https://realpython.com/pandas-read-write-files/")
>>> history.appendleft("https://realpython.com/python-csv/")
>>> history
deque(['https://realpython.com/python-csv/',
       'https://realpython.com/pandas-read-write-files/',
       'https://realpython.com/'])

Bây giờ bạn có Mary, John và Susan trong hàng đợi. Hãy nhớ rằng vì hàng đợi là FIFO, người đầu tiên tham gia hàng đợi nên là người đầu tiên ra ngoài.

Bây giờ hãy tưởng tượng một thời gian trôi qua và một vài bảng trở nên có sẵn. Ở giai đoạn này, bạn muốn loại bỏ mọi người khỏi hàng đợi theo đúng thứ tự. Đây là cách bạn sẽ làm điều đó:

>>>

>>> history.popleft()
'https://realpython.com/python-csv/'

>>> history.popleft()
'https://realpython.com/pandas-read-write-files/'

>>> history
deque(['https://realpython.com/'])

Bây giờ bạn có Mary, John và Susan trong hàng đợi. Hãy nhớ rằng vì hàng đợi là FIFO, người đầu tiên tham gia hàng đợi nên là người đầu tiên ra ngoài.

Bây giờ hãy tưởng tượng một thời gian trôi qua và một vài bảng trở nên có sẵn. Ở giai đoạn này, bạn muốn loại bỏ mọi người khỏi hàng đợi theo đúng thứ tự. Đây là cách bạn sẽ làm điều đó:

Mỗi khi bạn gọi >>> queue.popleft() 'Mary' >>> queue deque(['John', 'Susan']) >>> queue.popleft() 'John' >>> queue deque(['Susan']) 8, bạn sẽ xóa phần tử đầu khỏi danh sách được liên kết, bắt chước một hàng đợi ngoài đời thực.

Ngăn xếp

  1. Điều gì sẽ xảy ra nếu bạn muốn tạo một ngăn xếp thay thế? Vâng, ý tưởng ít nhiều giống như với hàng đợi. Sự khác biệt duy nhất là ngăn xếp sử dụng phương pháp LIFO, có nghĩa là phần tử cuối cùng được chèn vào ngăn xếp phải là loại đầu tiên được loại bỏ.
  2. Hãy tưởng tượng bạn đang tạo ra một chức năng lịch sử của trình duyệt web, trong đó lưu trữ mỗi trang mà người dùng truy cập để họ có thể quay ngược thời gian một cách dễ dàng. Giả sử đây là những hành động mà người dùng ngẫu nhiên thực hiện trên trình duyệt của họ:
  3. Truy cập trang web thực sự của Python

Điều hướng đến Pandas: Cách đọc và ghi tệp

Nhấp vào liên kết để đọc và viết các tệp CSV bằng Python

Nếu bạn thích ánh xạ hành vi này vào một ngăn xếp, thì bạn có thể làm điều gì đó như sau:

class LinkedList:
    def __init__(self):
        self.head = None

Trong ví dụ này, bạn đã tạo một đối tượng

>>> queue.popleft()
'Mary'

>>> queue
deque(['John', 'Susan'])

>>> queue.popleft()
'John'

>>> queue
deque(['Susan'])
9 trống và mỗi khi người dùng truy cập một trang web mới, bạn đã thêm nó vào biến
>>> queue.popleft()
'Mary'

>>> queue
deque(['John', 'Susan'])

>>> queue.popleft()
'John'

>>> queue
deque(['Susan'])
9 của mình bằng
>>> from collections import deque
>>> history = deque()

>>> history.appendleft("https://realpython.com/")
>>> history.appendleft("https://realpython.com/pandas-read-write-files/")
>>> history.appendleft("https://realpython.com/python-csv/")
>>> history
deque(['https://realpython.com/python-csv/',
       'https://realpython.com/pandas-read-write-files/',
       'https://realpython.com/'])
1. Làm như vậy đảm bảo rằng mỗi phần tử mới đã được thêm vào
>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
0 của danh sách được liên kết.

>>> from collections import deque
>>> deque()
deque([])
0

Bây giờ giả sử rằng sau khi người dùng đọc cả hai bài viết, họ muốn quay lại trang chủ Python thực sự để chọn một bài viết mới để đọc. Biết rằng bạn có một ngăn xếp và muốn loại bỏ các yếu tố bằng LIFO, bạn có thể làm như sau:

>>> from collections import deque
>>> history = deque()

>>> history.appendleft("https://realpython.com/")
>>> history.appendleft("https://realpython.com/pandas-read-write-files/")
>>> history.appendleft("https://realpython.com/python-csv/")
>>> history
deque(['https://realpython.com/python-csv/',
       'https://realpython.com/pandas-read-write-files/',
       'https://realpython.com/'])
8 and
>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
1
. You can also add a
>>> history.popleft()
'https://realpython.com/python-csv/'

>>> history.popleft()
'https://realpython.com/pandas-read-write-files/'

>>> history
deque(['https://realpython.com/'])
0 to both classes to have a more helpful representation of the objects:

>>> from collections import deque
>>> deque()
deque([])
1

Có bạn đi! Sử dụng

>>> queue.popleft()
'Mary'

>>> queue
deque(['John', 'Susan'])

>>> queue.popleft()
'John'

>>> queue
deque(['Susan'])
8, bạn đã xóa các phần tử khỏi
>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
0 của danh sách được liên kết cho đến khi bạn đến trang chủ Python thực sự.

>>>

>>> from collections import deque
>>> deque()
deque([])
2

Từ các ví dụ trên, bạn có thể thấy mức độ hữu ích của việc có

>>> deque(['a','b','c'])
deque(['a', 'b', 'c'])

>>> deque('abc')
deque(['a', 'b', 'c'])

>>> deque([{'data': 'a'}, {'data': 'b'}])
deque([{'data': 'a'}, {'data': 'b'}])
9 trong hộp công cụ của mình, vì vậy hãy đảm bảo sử dụng nó vào lần tới khi bạn có một thử thách dựa trên hàng đợi hoặc ngăn xếp để giải quyết.

Thực hiện danh sách được liên kết của riêng bạn

>>> from collections import deque
>>> deque()
deque([])
3

Bây giờ bạn đã biết cách sử dụng

>>> deque(['a','b','c'])
deque(['a', 'b', 'c'])

>>> deque('abc')
deque(['a', 'b', 'c'])

>>> deque([{'data': 'a'}, {'data': 'b'}])
deque([{'data': 'a'}, {'data': 'b'}])
9 để xử lý các danh sách được liên kết, bạn có thể tự hỏi tại sao bạn sẽ thực hiện danh sách được liên kết của riêng mình trong Python. Có một vài lý do để làm điều đó:

Thực hành các kỹ năng thuật toán Python của bạn

Tìm hiểu về lý thuyết cấu trúc dữ liệutraverse it. Traversing means going through every single node, starting with the

>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
0 of the linked list and ending on the node that has a
>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
1 value of
>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
2.

Chuẩn bị cho các cuộc phỏng vấn việc làm

>>> from collections import deque
>>> deque()
deque([])
4

Vui lòng bỏ qua phần tiếp theo này nếu bạn không quan tâm đến bất kỳ điều nào ở trên hoặc nếu bạn đã thực hiện danh sách được liên kết của riêng mình trong Python. Nếu không, đó là thời gian để thực hiện một số danh sách được liên kết!

Sau khi mang lại nút hiện tại, bạn muốn chuyển sang nút tiếp theo trong danh sách. Đó là lý do tại sao bạn thêm

class LinkedList:
    def __init__(self):
        self.head = None
4. Ở đây, một ví dụ về việc đi qua một danh sách ngẫu nhiên và in từng nút:

>>>

>>> from collections import deque
>>> deque()
deque([])
5

Trong các bài viết khác, bạn có thể thấy việc đi qua được xác định thành một phương thức cụ thể gọi là

class LinkedList:
    def __init__(self):
        self.head = None
5. Tuy nhiên, bằng cách sử dụng các phương pháp tích hợp Python, để đạt được hành vi nói trên làm cho việc triển khai danh sách được liên kết này trở nên pythonic hơn một chút.

Cách chèn một nút mới

Có nhiều cách khác nhau để chèn các nút mới vào một danh sách được liên kết, mỗi nút có triển khai riêng và mức độ phức tạp. Đó là lý do tại sao bạn sẽ thấy chúng chia thành các phương pháp cụ thể để chèn vào đầu, kết thúc hoặc giữa các nút của danh sách.

Chèn vào đầu

Chèn một nút mới ở đầu danh sách có lẽ là phần chèn đơn giản nhất vì bạn không phải đi qua toàn bộ danh sách để làm điều đó. Nó có tất cả về việc tạo ra một nút mới và sau đó trỏ

>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
0 của danh sách vào nó.

Hãy xem việc triển khai

class LinkedList:
    def __init__(self):
        self.head = None
7 sau đây cho lớp
>>> history.popleft()
'https://realpython.com/python-csv/'

>>> history.popleft()
'https://realpython.com/pandas-read-write-files/'

>>> history
deque(['https://realpython.com/'])
3:

>>> from collections import deque
>>> deque()
deque([])
6

Trong ví dụ trên, bạn đã cài đặt

class LinkedList:
    def __init__(self):
        self.head = None
9 làm tài liệu tham khảo
>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
1 của nút mới để nút mới trỏ đến
class LinkedList:
    def __init__(self):
        self.head = None
9 cũ. Sau đó, bạn cần nói rằng
>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
0 mới của danh sách là nút được chèn.

Ở đây, cách thức hoạt động của nó với một danh sách mẫu:

>>>

>>> from collections import deque
>>> deque()
deque([])
7

Trong các bài viết khác, bạn có thể thấy việc đi qua được xác định thành một phương thức cụ thể gọi là

class LinkedList:
    def __init__(self):
        self.head = None
5. Tuy nhiên, bằng cách sử dụng các phương pháp tích hợp Python, để đạt được hành vi nói trên làm cho việc triển khai danh sách được liên kết này trở nên pythonic hơn một chút.

Cách chèn một nút mới

Có nhiều cách khác nhau để chèn các nút mới vào một danh sách được liên kết, mỗi nút có triển khai riêng và mức độ phức tạp. Đó là lý do tại sao bạn sẽ thấy chúng chia thành các phương pháp cụ thể để chèn vào đầu, kết thúc hoặc giữa các nút của danh sách.

Chèn vào đầu

>>> from collections import deque
>>> deque()
deque([])
8

Chèn một nút mới ở đầu danh sách có lẽ là phần chèn đơn giản nhất vì bạn không phải đi qua toàn bộ danh sách để làm điều đó. Nó có tất cả về việc tạo ra một nút mới và sau đó trỏ

>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
0 của danh sách vào nó.

Hãy xem việc triển khai

class LinkedList:
    def __init__(self):
        self.head = None
7 sau đây cho lớp
>>> history.popleft()
'https://realpython.com/python-csv/'

>>> history.popleft()
'https://realpython.com/pandas-read-write-files/'

>>> history
deque(['https://realpython.com/'])
3:

>>>

>>> from collections import deque
>>> deque()
deque([])
9

Trong ví dụ trên, bạn đã cài đặt

class LinkedList:
    def __init__(self):
        self.head = None
9 làm tài liệu tham khảo
>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
1 của nút mới để nút mới trỏ đến
class LinkedList:
    def __init__(self):
        self.head = None
9 cũ. Sau đó, bạn cần nói rằng
>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
0 mới của danh sách là nút được chèn.

Ở đây, cách thức hoạt động của nó với một danh sách mẫu:

Như bạn có thể thấy,

class LinkedList:
    def __init__(self):
        self.head = None
7 luôn thêm nút vào
>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
0 của danh sách, ngay cả khi danh sách trống trước đó.

  1. Chèn vào cuối
  2. Chèn một nút mới ở cuối danh sách buộc bạn phải đi qua toàn bộ danh sách được liên kết trước và thêm nút mới khi bạn đạt đến cuối. Bạn có thể chỉ cần nối vào cuối cùng như bạn làm với một danh sách bình thường bởi vì trong một danh sách được liên kết, bạn không biết nút nào là cuối cùng.

Ở đây, một ví dụ triển khai một hàm để chèn một nút vào cuối danh sách được liên kết:

Đầu tiên, bạn muốn đi qua toàn bộ danh sách cho đến khi bạn đạt đến kết thúc (nghĩa là cho đến khi vòng lặp ____105 tăng ngoại lệ

>>> from collections import deque
>>> deque()
deque([])
06). Tiếp theo, bạn muốn đặt
>>> from collections import deque
>>> deque()
deque([])
07 làm nút cuối cùng trong danh sách. Cuối cùng, bạn muốn thêm nút mới làm giá trị
>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
1 của
>>> from collections import deque
>>> deque()
deque([])
07 đó.

>>> deque(['a','b','c'])
deque(['a', 'b', 'c'])

>>> deque('abc')
deque(['a', 'b', 'c'])

>>> deque([{'data': 'a'}, {'data': 'b'}])
deque([{'data': 'a'}, {'data': 'b'}])
0

Ở đây, một ví dụ về

>>> from collections import deque
>>> deque()
deque([])
10 trong hành động:

Trong mã ở trên, bạn bắt đầu bằng cách tạo một danh sách với bốn giá trị (

>>> from collections import deque
>>> deque()
deque([])
11,
>>> from collections import deque
>>> deque()
deque([])
12,
>>> from collections import deque
>>> deque()
deque([])
13 và
>>> from collections import deque
>>> deque()
deque([])
14). Sau đó, khi bạn thêm các nút mới bằng
>>> from collections import deque
>>> deque()
deque([])
10, bạn có thể thấy các nút luôn được nối vào cuối danh sách.

>>>

>>> deque(['a','b','c'])
deque(['a', 'b', 'c'])

>>> deque('abc')
deque(['a', 'b', 'c'])

>>> deque([{'data': 'a'}, {'data': 'b'}])
deque([{'data': 'a'}, {'data': 'b'}])
1

Chèn giữa hai nút

Chèn giữa hai nút bổ sung thêm một lớp phức tạp khác vào danh sách được liên kết, các phần chèn đã phức tạp vì có hai cách tiếp cận khác nhau mà bạn có thể sử dụng:

>>> deque(['a','b','c'])
deque(['a', 'b', 'c'])

>>> deque('abc')
deque(['a', 'b', 'c'])

>>> deque([{'data': 'a'}, {'data': 'b'}])
deque([{'data': 'a'}, {'data': 'b'}])
2

Chèn sau một nút hiện có

Chèn trước một nút hiện có

Có vẻ kỳ lạ khi chia chúng thành hai phương thức, nhưng các danh sách được liên kết hoạt động khác với danh sách thông thường và bạn cần một triển khai khác nhau cho mỗi trường hợp.

Ở đây, một phương thức thêm một nút sau một nút hiện có với giá trị dữ liệu cụ thể:

>>>

>>> deque(['a','b','c'])
deque(['a', 'b', 'c'])

>>> deque('abc')
deque(['a', 'b', 'c'])

>>> deque([{'data': 'a'}, {'data': 'b'}])
deque([{'data': 'a'}, {'data': 'b'}])
3

Trong mã trên, bạn đang đi qua danh sách được liên kết tìm kiếm nút với dữ liệu cho biết nơi bạn muốn chèn một nút mới. Khi bạn tìm thấy nút mà bạn đang tìm kiếm, bạn sẽ chèn nút mới ngay sau đó và tua lại tham chiếu

>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
1 để duy trì tính nhất quán của danh sách.

Cách xóa một nút

Để xóa một nút khỏi danh sách được liên kết, trước tiên bạn cần phải đi qua danh sách cho đến khi bạn tìm thấy nút bạn muốn xóa. Khi bạn tìm thấy mục tiêu, bạn muốn liên kết các nút trước và tiếp theo của nó. Liên kết lại này là những gì loại bỏ nút đích khỏi danh sách.

Điều đó có nghĩa là bạn cần theo dõi nút trước khi bạn đi qua danh sách. Hãy xem một triển khai ví dụ:

>>> deque(['a','b','c'])
deque(['a', 'b', 'c'])

>>> deque('abc')
deque(['a', 'b', 'c'])

>>> deque([{'data': 'a'}, {'data': 'b'}])
deque([{'data': 'a'}, {'data': 'b'}])
4

Trong mã trên, trước tiên bạn kiểm tra xem danh sách của bạn không trống (dòng 2). Nếu có, thì bạn sẽ tăng một ngoại lệ. Sau đó, bạn kiểm tra xem nút sẽ được xóa có phải là

>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
0 hiện tại của danh sách (dòng 5) không. Nếu có, thì bạn muốn nút tiếp theo trong danh sách trở thành
>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
0 mới.

Nếu không có điều nào ở trên xảy ra, thì bạn bắt đầu đi qua danh sách tìm kiếm nút sẽ bị xóa (dòng 10). Nếu bạn tìm thấy nó, thì bạn cần cập nhật nút trước đó của nó để trỏ đến nút tiếp theo của nó, tự động xóa nút tìm thấy khỏi danh sách. Cuối cùng, nếu bạn đi qua toàn bộ danh sách mà không tìm thấy nút sẽ bị xóa (dòng 16), thì bạn sẽ tăng một ngoại lệ.

Lưu ý cách trong mã trên bạn sử dụng

>>> from collections import deque
>>> deque()
deque([])
29 để theo dõi nút trước đó. Làm như vậy đảm bảo rằng toàn bộ quá trình sẽ đơn giản hơn nhiều khi bạn tìm đúng nút sẽ bị xóa.

Ở đây, một ví dụ sử dụng danh sách:

>>>

>>> deque(['a','b','c'])
deque(['a', 'b', 'c'])

>>> deque('abc')
deque(['a', 'b', 'c'])

>>> deque([{'data': 'a'}, {'data': 'b'}])
deque([{'data': 'a'}, {'data': 'b'}])
5

Đó là nó! Bây giờ bạn đã biết cách thực hiện một danh sách được liên kết và tất cả các phương pháp chính để đi qua, chèn và xóa các nút. Nếu bạn cảm thấy thoải mái với những gì bạn đã học được và bạn khao khát nhiều hơn, thì hãy thoải mái chọn một trong những thách thức dưới đây:

  1. Tạo một phương thức để lấy một phần tử từ một vị trí cụ thể:
    >>> from collections import deque
    >>> deque()
    deque([])
    
    30 hoặc thậm chí
    >>> from collections import deque
    >>> deque()
    deque([])
    
    31.
  2. Tạo một phương thức để đảo ngược danh sách được liên kết:
    >>> from collections import deque
    >>> deque()
    deque([])
    
    32.
  3. Tạo một đối tượng
    >>> from collections import deque
    >>> deque()
    deque([])
    
    33 kế thừa danh sách liên kết bài viết này với các phương thức
    >>> from collections import deque
    >>> deque()
    deque([])
    
    34 và
    >>> from collections import deque
    >>> deque()
    deque([])
    
    35.

Ngoài việc thực hành tuyệt vời, tự mình thực hiện một số thử thách thêm là một cách hiệu quả để đồng hóa tất cả kiến ​​thức mà bạn đã đạt được. Nếu bạn muốn bắt đầu bằng cách sử dụng lại tất cả mã nguồn từ bài viết này, thì bạn có thể tải xuống mọi thứ bạn cần tại liên kết bên dưới:

Sử dụng danh sách được liên kết nâng cao

Cho đến bây giờ, bạn đã tìm hiểu về một loại danh sách được liên kết cụ thể có tên là Danh sách liên kết đơn lẻ. Nhưng có nhiều loại danh sách được liên kết có thể được sử dụng cho các mục đích hơi khác nhau.singly linked lists. But there are more types of linked lists that can be used for slightly different purposes.

Cách sử dụng danh sách liên kết gấp đôi

Danh sách liên kết gấp đôi khác với các danh sách liên kết đơn lẻ ở chỗ chúng có hai tài liệu tham khảo:

  1. Trường
    >>> from collections import deque
    >>> deque()
    deque([])
    
    36 tham chiếu nút trước đó.
  2. Trường
    >>> llist = deque("abcde")
    >>> llist
    deque(['a', 'b', 'c', 'd', 'e'])
    
    >>> llist.append("f")
    >>> llist
    deque(['a', 'b', 'c', 'd', 'e', 'f'])
    
    >>> llist.pop()
    'f'
    
    >>> llist
    deque(['a', 'b', 'c', 'd', 'e'])
    
    1 tham chiếu nút tiếp theo.

Kết quả cuối cùng trông như thế này:

Hướng dẫn what are linked lists in python? - danh sách được liên kết trong python là gì?
Nút (danh sách liên kết gấp đôi)

Nếu bạn muốn thực hiện các điều trên, thì bạn có thể thực hiện một số thay đổi đối với lớp

>>> history.popleft()
'https://realpython.com/python-csv/'

>>> history.popleft()
'https://realpython.com/pandas-read-write-files/'

>>> history
deque(['https://realpython.com/'])
4 hiện tại của mình để bao gồm trường
>>> from collections import deque
>>> deque()
deque([])
36:

>>> deque(['a','b','c'])
deque(['a', 'b', 'c'])

>>> deque('abc')
deque(['a', 'b', 'c'])

>>> deque([{'data': 'a'}, {'data': 'b'}])
deque([{'data': 'a'}, {'data': 'b'}])
6

Loại triển khai này sẽ cho phép bạn đi qua một danh sách theo cả hai hướng thay vì chỉ đi qua bằng cách sử dụng

>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
1. Bạn có thể sử dụng
>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
1 để đi tiếp và
>>> from collections import deque
>>> deque()
deque([])
36 để đi lùi.

Về mặt cấu trúc, đây là cách một danh sách được liên kết gấp đôi sẽ trông như thế nào:

Hướng dẫn what are linked lists in python? - danh sách được liên kết trong python là gì?
Danh sách liên kết gấp đôi

Bạn đã học được trước đó rằng

>>> deque(['a','b','c'])
deque(['a', 'b', 'c'])

>>> deque('abc')
deque(['a', 'b', 'c'])

>>> deque([{'data': 'a'}, {'data': 'b'}])
deque([{'data': 'a'}, {'data': 'b'}])
9 sử dụng một danh sách được liên kết như một phần của cấu trúc dữ liệu của nó. Đây là loại danh sách được liên kết mà nó sử dụng. Với các danh sách được liên kết gấp đôi,
>>> from collections import deque
>>> queue = deque()
>>> queue
deque([])

>>> queue.append("Mary")
>>> queue.append("John")
>>> queue.append("Susan")
>>> queue
deque(['Mary', 'John', 'Susan'])
3 có khả năng chèn hoặc xóa các phần tử từ cả hai đầu của hàng đợi có hiệu suất O (1) không đổi.

Cách sử dụng danh sách liên kết tròn

Danh sách liên kết tròn là một loại danh sách được liên kết trong đó nút cuối cùng chỉ trở lại

>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
0 của danh sách thay vì trỏ đến
>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
2. Đây là những gì làm cho chúng tròn. Danh sách liên kết tròn có khá nhiều trường hợp sử dụng thú vị:
are a type of linked list in which the last node points back to the
>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
0 of the list instead of pointing to
>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
2. This is what makes them circular. Circular linked lists have quite a few interesting use cases:

  • Đi xung quanh mỗi người chơi, lượt quay trong một trò chơi nhiều người chơi
  • Quản lý vòng đời ứng dụng của một hệ điều hành nhất định
  • Thực hiện một đống fibonacci

Đây là những gì một danh sách liên kết tròn trông giống như:

Hướng dẫn what are linked lists in python? - danh sách được liên kết trong python là gì?
Danh sách liên kết tròn

Một trong những lợi thế của danh sách liên kết tròn là bạn có thể đi qua toàn bộ danh sách bắt đầu tại bất kỳ nút nào. Vì nút cuối cùng chỉ vào

>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
0 của danh sách, bạn cần đảm bảo rằng bạn ngừng đi qua khi đến điểm bắt đầu. Nếu không, bạn sẽ kết thúc trong một vòng lặp vô hạn.

Về mặt thực hiện, các danh sách liên kết tròn rất giống với danh sách liên kết đơn lẻ. Sự khác biệt duy nhất là bạn có thể xác định điểm bắt đầu khi bạn đi qua danh sách:

>>> deque(['a','b','c'])
deque(['a', 'b', 'c'])

>>> deque('abc')
deque(['a', 'b', 'c'])

>>> deque([{'data': 'a'}, {'data': 'b'}])
deque([{'data': 'a'}, {'data': 'b'}])
7

Đi qua danh sách bây giờ nhận được một đối số bổ sung,

>>> from collections import deque
>>> deque()
deque([])
48, được sử dụng để xác định bắt đầu và (vì danh sách là hình tròn) kết thúc của quá trình lặp. Ngoài ra, phần lớn mã giống như những gì chúng tôi có trong lớp
>>> history.popleft()
'https://realpython.com/python-csv/'

>>> history.popleft()
'https://realpython.com/pandas-read-write-files/'

>>> history
deque(['https://realpython.com/'])
3 của chúng tôi.

Để kết thúc với một ví dụ cuối cùng, hãy xem loại danh sách mới này hoạt động khi bạn cung cấp cho nó một số dữ liệu:

>>>

>>> deque(['a','b','c'])
deque(['a', 'b', 'c'])

>>> deque('abc')
deque(['a', 'b', 'c'])

>>> deque([{'data': 'a'}, {'data': 'b'}])
deque([{'data': 'a'}, {'data': 'b'}])
8

Ở đó bạn có nó! Bạn sẽ nhận thấy rằng bạn không còn có

>>> llist = deque("abcde")
>>> llist
deque(['a', 'b', 'c', 'd', 'e'])

>>> llist.append("f")
>>> llist
deque(['a', 'b', 'c', 'd', 'e', 'f'])

>>> llist.pop()
'f'

>>> llist
deque(['a', 'b', 'c', 'd', 'e'])
2 trong khi đi qua danh sách. Điều đó bởi vì không có kết thúc cụ thể cho một danh sách tròn. Bạn cũng có thể thấy rằng việc chọn các nút bắt đầu khác nhau sẽ hiển thị các biểu diễn hơi khác nhau của cùng một danh sách.

Sự kết luận

Trong bài viết này, bạn đã học được khá nhiều điều! Điều quan trọng nhất là:

  • Danh sách được liên kết là gì và khi nào bạn nên sử dụng chúng
  • Cách sử dụng
    >>> deque(['a','b','c'])
    deque(['a', 'b', 'c'])
    
    >>> deque('abc')
    deque(['a', 'b', 'c'])
    
    >>> deque([{'data': 'a'}, {'data': 'b'}])
    deque([{'data': 'a'}, {'data': 'b'}])
    
    9 để thực hiện hàng đợi và ngăn xếp
  • Cách thực hiện các lớp danh sách và nút được liên kết của riêng bạn, cộng với các phương thức có liên quan
  • Các loại danh sách được liên kết khác là gì và những gì chúng có thể được sử dụng cho

Nếu bạn muốn tìm hiểu thêm về các danh sách được liên kết, thì hãy xem bài đăng trung bình của Vaidehi Joshi, để biết giải thích trực quan hay. Nếu bạn quan tâm đến một hướng dẫn chuyên sâu hơn, thì bài viết Wikipedia khá kỹ lưỡng. Cuối cùng, nếu bạn tò mò về lý do đằng sau việc triển khai

>>> deque(['a','b','c'])
deque(['a', 'b', 'c'])

>>> deque('abc')
deque(['a', 'b', 'c'])

>>> deque([{'data': 'a'}, {'data': 'b'}])
deque([{'data': 'a'}, {'data': 'b'}])
9 hiện tại, thì hãy xem chủ đề Raymond Hettinger.

Bạn có thể tải xuống mã nguồn được sử dụng trong suốt hướng dẫn này bằng cách nhấp vào liên kết sau:

Hãy thoải mái để lại bất kỳ câu hỏi hoặc ý kiến ​​dưới đây. Happy Pythoning!

Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem cùng với hướng dẫn bằng văn bản để hiểu sâu hơn về sự hiểu biết của bạn: Làm việc với các danh sách được liên kết trong Python This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Working With Linked Lists in Python

Danh sách được liên kết là gì?

Một danh sách được liên kết là cấu trúc dữ liệu được tìm kiếm nhiều nhất khi xử lý các yếu tố dữ liệu động. Một danh sách được liên kết bao gồm một phần tử dữ liệu được gọi là một nút. Và mỗi nút bao gồm hai trường: một trường có dữ liệu và trong trường thứ hai, nút có một địa chỉ giữ một tham chiếu đến nút tiếp theo.the most sought-after data structure when it comes to handling dynamic data elements. A linked list consists of a data element known as a node. And each node consists of two fields: one field has data, and in the second field, the node has an address that keeps a reference to the next node.

Tại sao sử dụng các danh sách được liên kết trong Python?

Tại sao sử dụng danh sách được liên kết?Một danh sách được liên kết lưu bộ nhớ.Nó chỉ phân bổ bộ nhớ cần thiết cho các giá trị được lưu trữ.Trong các mảng, bạn phải đặt kích thước mảng trước khi điền vào các giá trị, có khả năng lãng phí bộ nhớ.

Danh sách được liên kết với ví dụ là gì?

Giống như một vòng hoa được làm bằng hoa, một danh sách liên kết được tạo thành từ các nút.Chúng tôi gọi mọi bông hoa trên vòng hoa đặc biệt này là một nút.Và mỗi nút chỉ vào nút tiếp theo trong danh sách này cũng như nó có dữ liệu (ở đây là loại hoa).a linked list is made up of nodes. We call every flower on this particular garland to be a node. And each of the node points to the next node in this list as well as it has data (here it is type of flower).

Các loại danh sách được liên kết trong Python là gì?

Có bốn loại chính của danh sách được liên kết:..
Danh sách liên kết đơn lẻ ..
Danh sách liên kết gấp đôi ..
Danh sách liên kết tròn ..
Danh sách liên kết nhân đôi tròn ..