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:
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ếtDanh 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ínhTrướ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:
Ở đây, những gì một nút điển hình trông như thế nào: NútMộ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à 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 1 trỏ đến 2 để xác định kết thúc của danh sách. Ở đây, nó trông như thế nào: 0, and it’s used as the starting point for any iteration
through the list. The last node must have its 1 reference pointing to 2 to determine the end of the list. Here’s how it looks:Danh sách liên kếtBâ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ếpHà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: Xếp hàngTrong 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: Cây rơmTrong 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 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: Đồ thị acyclic định hướngCó 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:
5 → 6 → không có 6 → Không có
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 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ếtTrong 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 5 hoặc 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ọ: 7 và 8.Sự khác biệt chính giữa các phương pháp này là bạn sử dụng 5 và 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 6 và 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 5, 7, 6 và 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 6 hoặc 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'}]) 9Trong Python, có một đối tượng cụ thể trong mô-đun 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. 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'}]) 9Theo mặc định, có khá nhiều phương pháp với đối tượng 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 3:>>>
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: >>>
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 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.>>>
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: >>>
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 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 7 và thêm phần tử mới 8 như thế này:Hàng đợiVới hàng đợi, bạn muốn thêm các giá trị vào danh sách ( 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 ( 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:>>>
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 đó: >>>
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 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
Điều hướng đến Pandas: Cách đọc và ghi tệp >>>
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 đó: >>>
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
Đ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 PythonNế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:
Trong ví dụ này, bạn đã tạo một đối tượng 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 9 của mình bằng 1. Làm như vậy đảm bảo rằng mỗi phần tử mới đã được thêm vào 0 của danh sách được liên kết. 0Bâ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: 0 to both classes to have a more helpful representation of the objects: 1Có bạn đi! Sử dụng 8, bạn đã xóa các phần tử khỏi 0 của danh sách được liên kết cho đến khi bạn đến trang chủ Python thực sự.>>> 2Từ các ví dụ trên, bạn có thể thấy mức độ hữu ích của việc có 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 3Bây giờ bạn đã biết cách sử dụng 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ạnTì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 0 of the linked list and ending on the node that has a 1 value of 2.Chuẩn bị cho các cuộc phỏng vấn việc làm 4Vui 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 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:>>> 5Trong 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à 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ớiCó 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 đầuChè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ỏ 0 của danh sách vào nó.Hãy xem việc triển khai 7 sau đây cho lớp 3: 6Trong ví dụ trên, bạn đã cài đặt 9 làm tài liệu tham khảo 1 của nút mới để nút mới trỏ đến 9 cũ. Sau đó, bạn cần nói rằng 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: >>> 7Trong 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à 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ớiCó 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 8Chè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ỏ 0 của danh sách vào nó.Hãy xem việc triển khai 7 sau đây cho lớp 3:>>> 9Trong ví dụ trên, bạn đã cài đặt 9 làm tài liệu tham khảo 1 của nút mới để nút mới trỏ đến 9 cũ. Sau đó, bạn cần nói rằng 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, 7 luôn thêm nút vào 0 của danh sách, ngay cả khi danh sách trống trước đó.
Ở đâ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ệ 06). Tiếp theo, bạn muốn đặt 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ị 1 của 07 đó. 0Ở đây, một ví dụ về 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ị ( 11, 12, 13 và 14). Sau đó, khi bạn thêm các nút mới bằng 10, bạn có thể thấy các nút luôn được nối vào cuối danh sách.>>> 1Chè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: 2Chè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ể: >>> 3Trong 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 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ụ: 4Trong 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à 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 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 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: >>> 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:
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 caoCho đế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 đôiDanh 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:
Kết quả cuối cùng trông như thế này: 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 4 hiện tại của mình để bao gồm trường 36: 6Loạ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 1. Bạn có thể sử dụng 1 để đi tiếp và 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: Danh sách liên kết gấp đôiBạn đã học được trước đó rằng 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, 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ònDanh 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 0 of the list instead of pointing to 2. This is what makes them circular. Circular linked lists have quite a few interesting use cases:
Đây là những gì một danh sách liên kết tròn trông giống như: Danh sách liên kết trònMộ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 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: 7Đi qua danh sách bây giờ nhận được một đối số bổ sung, 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 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: >>> 8Ở đó bạn có nó! Bạn sẽ nhận thấy rằng bạn không còn có 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ậnTrong bài viết này, bạn đã học được khá nhiều điều! Điều quan trọng nhất là:
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 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 .. |