Danh sách Python có phải là số 1 không?
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. Chúng không phổ biến hay thú vị bằng và thậm chí bạn có thể không nhớ chúng từ lớp thuật toán của mình. Nhưng trong bối cảnh phù hợp, họ thực sự có thể tỏa sáng Show
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 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ấ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á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 Lấy mã nguồn. Nhấp vào đây để lấy mã nguồn mà bạn sẽ sử dụng để tìm hiểu về danh sách được liên kết trong hướng dẫn này Hiểu danh sách liên kếtDanh sách liên kết là một tập hợp các đối tượng được sắp xếp theo thứ tự. Vậy điều gì làm cho chúng khác với danh sách bình thường? . Trong khi các danh sách sử dụng một khối bộ nhớ liền kề để lưu trữ các tham chiếu đến dữ liệu của chúng, thì các danh sách được liên kết lưu trữ các tham chiếu như một phần của các phần tử riêng của chúng. Loại bỏ các quảng cáoKhái niệm chínhTrước khi tìm hiểu sâu hơn về 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 phần tử của danh sách liên kết được gọi là một nút và mỗi nút có hai trường khác nhau
Đây là một nút điển hình trông như thế nào NútDanh sách liên kết là 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 trong danh sách. Nút cuối cùng phải có tham chiếu 1 trỏ đến 2 để xác định phần cuối của danh sách. Đây là giao diện của nóDanh sách liên kếtBây giờ bạn đã biết cách cấu trúc danh sách được liên kết, bạn đã sẵn sàng xem xét một số trường hợp sử dụng thực tế cho danh sách đó Ứng dụng thực tếDanh sách được liên kết phục vụ nhiều mục đích khác nhau trong thế giới thực. Chúng có thể được sử dụng để thực hiện (cảnh báo spoiler. ) hàng đợi hoặc ngăn xếp cũng như đồ thị. Chúng cũng hữu ích cho các tác 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 ở cách truy xuất các phần tử. Đối với hàng đợi, bạn sử dụng phương pháp Nhập trước/Xuất trước (FIFO). Điều đó có nghĩa là phần tử đầu tiên được chèn vào danh sách là phần tử đầu tiên được truy xuất Xếp hàngTrong sơ đồ trên, bạn có thể thấy các phần tử phía trước và phía sau của hàng đợi. Khi bạn thêm các phần tử mới vào hàng đợi, chúng sẽ chuyển đến phần cuối. Khi bạn truy xuất các phần tử, chúng sẽ được lấy từ đầu hàng đợi Đối với ngăn xếp, bạn sử dụng phương pháp Nhập sau/Xuất trước (LIFO), nghĩa là phần tử cuối cùng được chèn vào danh sách là phần tử đầu tiên được truy xuất Cây rơmTrong sơ đồ trên, bạn có thể thấy rằng phần tử đầu tiên được chèn vào ngăn xếp (chỉ số 3) ở dưới cùng và phần tử cuối cùng được chèn vào ở trên cùng. Vì các ngăn xếp sử dụng phương pháp LIFO, nên phần tử cuối cùng được chèn (ở trên cùng) sẽ là phần tử đầu tiên được truy xuấtDo 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 để triển khai 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 đồ—giả sử biểu đồ tuần hoàn có hướng (DAG)—có thể trông như thế này Đồ thị tuần hoàn có hướngCó nhiều cách khác nhau để triển khai 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ề là một danh sách các danh sách được liên kết trong đó mỗi đỉnh của đồ thị được lưu trữ cùng với một tập hợp các đỉnh được kết nối VertexLinked Danh sách các đỉnh12 → 3 → Không có24 → Không có3None45 → 6 → Không có56 → Không có6None Trong bảng trên, mỗi đỉnh của đồ thị của bạn được liệt kê ở cột bên trái. Cột bên phải chứa dãy danh sách liên kết chứa các đỉnh khác được 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 bằng mã bằng cách sử dụng 4>>>
Các khóa của từ điển này là các đỉnh nguồn và giá trị cho mỗi khóa là một danh sách. Danh sách này thường được triển khai dưới dạng danh sách liên kết Ghi chú. Trong ví dụ trên, bạn có thể tránh lưu trữ các giá trị 2, nhưng chúng tôi đã giữ lại chúng ở đây để làm rõ và nhất quán với các ví dụ sauVề cả tốc độ và bộ nhớ, việc triển khai biểu đồ bằng danh sách kề rất hiệu quả so với, chẳng hạn như ma trận kề. Đó là lý do tại sao danh sách được liên kết rất hữu ích cho việc triển khai biểu đồ Loại bỏ các quảng cáoSo sánh hiệu suất. Danh sách so với 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 danh sách liên kết và mảng được lưu trữ trong bộ nhớ. Tuy nhiên, trong Python, danh sách là. Đ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 đọc thêm. Việc triển khai các mảng động của Python khá thú vị và chắc chắn đáng để đọc. Hãy chắc chắn rằng bạn đã xem qua và sử dụng kiến thức đó để trở nên nổi bật trong bữa tiệc tiếp theo của công ty bạn Vì sự khác biệt về mức sử dụng bộ nhớ giữa danh sách và danh sách được liên kết là không đáng kể, nên sẽ 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 phần 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 6 hoặc 7. Để xóa các phần tử khỏi danh sách, bạn có thể sử dụng các đối tác của chúng. 8 và 9Sự khác biệt chính giữa các phương pháp này là bạn sử dụng 6 và 8 để chèn hoặc xóa phần tử tại một vị trí cụ thể trong danh sách, nhưng bạn chỉ sử dụng 7 và 9 để chèn hoặc xóa phần tử ở cuối danh sáchBây giờ, một điều bạn cần biết về danh sách Python là việc chèn hoặc xóa các phần tử không ở cuối danh sách yêu cầu một số phần tử dịch chuyển trong nền, khiến thao tác trở nên phức tạp hơn về mặt thời gian. Bạn có thể đọc bài viết được đề cập ở trên về cách triển khai danh sách trong Python để hiểu rõ hơn cách triển khai 6, 8, 7 và 9 ảnh hưởng đến hiệu suất của chúngVới tất cả những điều này, mặc dù việc chèn các phần tử vào cuối danh sách bằng cách sử dụng 7 hoặc 6 sẽ có thời gian không đổi, O(1), khi bạn cố gắng chèn một phần tử gần hơn hoặc vào đầu danh sách, độ phức tạp của thời gian trung bình . Trê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 phần tử ở đầu hoặc cuối danh sách, trong đó độ phức tạp về thời gian của chúng luôn không đổi. Ô(1) Vì lý do này, 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 triển khai hàng đợi (FIFO), trong đó các phần tử liên tục được chèn và xóa ở đầu danh sách. Nhưng chúng hoạt động tương tự như một danh sách khi triển khai ngăn xếp (LIFO), trong đó các phần tử được chèn và xóa ở cuối danh sách Truy xuất các phần 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 phần tử nào bạn muốn truy cập, 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 danh sách được liên kết sẽ mất O(n) vì bạn cần duyệt qua toàn bộ danh sách để tìm phần tử Tuy nhiên, khi tìm kiếm một phần tử cụ thể, cả danh sách và danh sách được liên kết đều hoạt động rất giống nhau, với độ phức tạp về thời gian là 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 31 mà bạn có thể sử dụng cho các danh sách được liên kết được gọi là (phát âm là “deck”), viết tắt của hàng đợi hai đầu 9 sử dụng 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 cuối danh sách với hiệu suất O(1) không đổiCá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 thứ đi kèm với một đối tượng 34. 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 xóa các phần tửĐầu tiên, bạn cần tạo một danh sách liên kết. Bạn có thể sử dụng đoạn mã sau để làm điều đó với 34>>> 8Đoạn mã trên sẽ tạo một danh sách liên kết rỗng. Nếu bạn muốn điền nó khi tạo, thì bạn có thể cung cấp cho nó một lần lặp làm đầu vào >>>
Khi khởi tạo một đối tượng 34, bạn có thể chuyển bất kỳ lần lặp nào làm đầu vào, chẳng hạn như một chuỗi (cũng là một lần lặp) hoặc danh sách các đối tượngBây giờ bạn đã biết cách tạo một đối tượng 34, bạn có thể tương tác với nó bằng cách thêm hoặc bớt các phần tử. Bạn có thể tạo danh sách liên kết 38 và thêm phần tử mới 39 như thế này>>>
Cả 50 và 51 đều thêm hoặc xóa các phần tử ở phía bên phải của danh sách được liên kết. Tuy nhiên, bạn cũng có thể sử dụng 34 để nhanh chóng thêm hoặc xóa các phần tử ở phía bên trái hoặc 0 của danh sách>>> 9Việc thêm hoặc xóa các phần tử ở cả hai đầu danh sách khá đơn giản bằng cách sử dụng đối tượng 34. Bây giờ bạn đã sẵn sàng học cách sử dụng 9 để triển khai hàng đợi hoặc ngăn xếpLoại bỏ các quảng cáoCách triển khai hàng đợi và ngăn xếpNhư bạn đã học ở trên, sự khác biệt chính giữa hàng đợi và ngăn xếp là cách bạn truy xuất các phần tử từ mỗi. Tiếp theo, bạn sẽ tìm hiểu cách sử dụng 9 để triển khai cả hai cấu trúc dữ liệuhàng đợiVới hàng đợi, bạn muốn thêm giá trị vào danh sách ( 57) và khi đúng thời điểm, bạn muốn xóa phần tử đã có trong danh sách lâu nhất ( 58). Ví dụ, hãy tưởng tượng một hàng đợi tại một nhà hàng thời thượng và đã được đặt kín chỗ. Nếu bạn đang cố triển khai một hệ thống sắp xếp chỗ ngồi hợp lý cho khách, thì bạn nên bắt đầu bằng cách tạo một hàng đợi và thêm người khi họ đến.>>> 3Bây giờ bạn có Mary, John và Susan trong hàng đợi. Hãy nhớ rằng vì hàng đợi là FIFO, nên người đầu tiên vào hàng đợi sẽ là người đầu tiên ra khỏi hàng đợi Bây giờ hãy tưởng tượng một thời gian trôi qua và một số bảng có sẵn. Ở giai đoạn này, bạn muốn xóa mọi người khỏi hàng đợi theo đúng thứ tự. Đây là cách bạn sẽ làm điều đó >>> 5Mỗi khi bạn gọi 59, 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ựcngăn xếpThay vào đó, nếu bạn muốn tạo một ngăn xếp thì sao? . Sự khác biệt duy nhất là ngăn xếp sử dụng phương pháp LIFO, nghĩa là phần tử cuối cùng được chèn vào ngăn xếp sẽ là phần tử đầu tiên bị loại bỏ Hãy tưởng tượng bạn đang tạo 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à một người dùng ngẫu nhiên thực hiện trên trình duyệt của họ
Nếu bạn muốn ánh xạ hành vi này thành một ngăn xếp, thì bạn có thể làm điều gì đó như thế này >>> 8Trong ví dụ này, bạn đã tạo một đối tượng 80 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 80 của mình bằng cách sử dụng 82. 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ếtBâ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ủ Real Python để 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 xóa các phần tử bằng LIFO, bạn có thể làm như sau >>> 3của bạn đi. Sử dụng 59, 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 truy cập trang chủ Real PythonTừ các ví dụ trên, bạn có thể thấy việc có 9 trong hộp công cụ của mình hữu ích như thế nào, vì vậy hãy đảm bảo sử dụng nó vào lần tiếp theo khi bạn có một thử thách dựa trên hàng đợi hoặc ngăn xếp cần giải quyếtLoại bỏ các quảng cáoTriển khai danh sách liên kết của riêng bạnBâ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 lại triển khai 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 đó
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ành công trong việc triển khai danh sách liên kết của riêng mình trong Python. Mặt khác, đã đến lúc triển khai một số danh sách được liên kết Cách tạo danh sách liên kếtTrước tiên, hãy tạo một lớp để đại diện cho danh sách được liên kết của bạn 8Thông tin duy nhất bạn cần lưu trữ cho danh sách được liên kết là nơi danh sách bắt đầu (_____10 của danh sách). Tiếp theo, tạo một lớp khác để đại diện cho từng nút của danh sách được liên kết 80Trong định nghĩa lớp trên, bạn có thể thấy hai phần tử chính của mỗi nút đơn. 89 và 1. Bạn cũng có thể thêm một 31 vào cả hai lớp để có một biểu diễn hữu ích hơn về các đối tượng 81Hãy xem một ví dụ về việc sử dụng các lớp trên để tạo nhanh một danh sách liên kết có ba nút >>> 82Bằng cách xác định các giá trị 89 và 1 của một nút, bạn có thể tạo một danh sách được liên kết khá nhanh chóng. Các lớp 34 và 35 này là điểm khởi đầu cho việc triển khai của chúng tôi. Từ giờ trở đi, tất cả chỉ là tăng chức năng của chúngĐây là một thay đổi nhỏ đối với danh sách được liên kết của 36 cho phép bạn nhanh chóng tạo danh sách được liên kết với một số dữ liệu 83Với sửa đổi trên, việc tạo danh sách liên kết để sử dụng trong các ví dụ bên dưới sẽ nhanh hơn rất nhiều Cách duyệt qua một danh sách được liên kếtMột trong những điều phổ biến nhất bạn sẽ làm với một danh sách được liên kết là duyệt qua nó. Đi ngang có nghĩa là đi qua từng nút đơn lẻ, bắt đầu bằng 0 của danh sách được liên kết và kết thúc ở nút có giá trị 1 là 2Di chuyển ngang chỉ là một cách thú vị hơn để nói lặp đi lặp lại. Vì vậy, với ý nghĩ đó, hãy tạo một 80 để thêm hành vi tương tự vào danh sách được liên kết mà bạn mong đợi từ một danh sách bình thường 84Phương thức trên đi qua danh sách và mang lại mọi nút đơn. Điều quan trọng nhất cần nhớ về 80 này là bạn cần luôn xác thực rằng 82 hiện tại không phải là 2. Khi điều kiện đó là 84, điều đó có nghĩa là bạn đã đến cuối danh sách được liên kết của mìnhSau khi kết quả 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 85. Đây là một ví dụ về việc duyệt qua một danh sách ngẫu nhiên và in từng nút>>> 85Trong các bài viết khác, bạn có thể thấy việc di chuyển ngang được định nghĩa thành một phương thức cụ thể có tên là 86. Tuy nhiên, việc sử dụng các phương thức tích hợp sẵn của Python để đạt được hành vi đã nói 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útLoại bỏ các quảng cáoCá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 danh sách được liên kết, mỗi cách có cách triển khai và mức độ phức tạp riêng. Đó là lý do tại sao bạn sẽ thấy chúng được chia thành các phương thức cụ thể để chèn vào đầu, cuối hoặc giữa các nút của danh sách Chèn lúc bắt đầuChèn một nút mới vào đầu danh sách có lẽ là cách chèn đơn giản nhất vì bạn không cần phải duyệt qua toàn bộ danh sách để thực hiện. Tất cả chỉ là tạo một nút mới và sau đó trỏ 0 của danh sách tới nút đóHãy xem triển khai sau đây của 88 cho lớp 34 86Trong ví dụ trên, bạn đang đặt 800 làm tham chiếu 1 của nút mới để nút mới trỏ tới 800 cũ. Sau đó, bạn cần chỉ ra rằng 0 mới của danh sách là nút được chènĐây là cách nó hoạt động với một danh sách mẫu >>> 87Như bạn có thể thấy, 88 luôn thêm nút vào 0 của danh sách, ngay cả khi danh sách trống trước đóChèn ở cuốiChèn một nút mới vào cuối danh sách buộc bạn phải duyệt qua toàn bộ danh sách được liên kết trước và thêm nút mới khi bạn đến cuối. Bạn không thể thêm vào cuối danh sách như với danh sách bình thường vì trong danh sách được liên kết, bạn không biết nút nào ở cuối cùng Đây là một ví dụ triển khai chức năng để chèn một nút vào cuối danh sách được liên kết 88Đầu tiên, bạn muốn duyệt qua toàn bộ danh sách cho đến khi bạn đến cuối (nghĩa là cho đến khi vòng lặp 806 tạo ra một ngoại lệ 807). Tiếp theo, bạn muốn đặt 808 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 808 đóĐây là một ví dụ về 811 đang hoạt động>>> 89Trong đoạn mã trên, bạn bắt đầu bằng cách tạo một danh sách có bốn giá trị (________ 2812, ________ 2813, ________ 2814 và ________ 2815). Sau đó, khi bạn thêm các nút mới bằng cách sử dụng 811, bạn có thể thấy rằng các nút đó luôn được thêm vào cuối danh sáchChèn giữa hai nútViệc chèn vào giữa hai nút sẽ thêm một lớp phức tạp khác vào các thao tác chèn vốn đã phức tạp của danh sách được liên kết vì có hai cách tiếp cận khác nhau mà bạn có thể sử dụng
Việc chia các phương pháp này thành hai phương pháp có vẻ lạ, nhưng 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 có cách triển khai khác cho từng trường hợp Đây là một phương pháp thêm một nút sau một nút hiện có với một giá trị dữ liệu cụ thể 0Trong đoạn mã trên, bạn đang duyệt qua danh sách được liên kết để tìm nút có dữ liệu cho biết nơi bạn muốn chèn 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 nút đó và viết lại tham chiếu 1 để duy trì tính nhất quán của danh sáchCác ngoại lệ duy nhất là nếu danh sách trống, khiến không thể chèn nút mới sau nút hiện có hoặc nếu danh sách không chứa giá trị bạn đang tìm kiếm. Dưới đây là một vài ví dụ về cách 818 cư xử>>> 1Cố gắng sử dụng 818 trên một danh sách trống sẽ dẫn đến một ngoại lệ. Điều tương tự cũng xảy ra khi bạn cố gắng thêm vào sau một nút không tồn tại. Mọi thứ khác hoạt động như mong đợiBây giờ, nếu bạn muốn triển khai 820, thì nó sẽ giống như thế này 2Có một số điều cần lưu ý khi thực hiện những điều trên. Trước tiên, như với 818, bạn muốn đảm bảo đưa ra một ngoại lệ nếu danh sách được liên kết trống (dòng 2) hoặc nút bạn đang tìm kiếm không có (dòng 16)Thứ hai, nếu bạn đang cố gắng thêm một nút mới trước phần đầu của danh sách (dòng 5), thì bạn có thể sử dụng lại 88 vì nút bạn đang chèn sẽ là 0 mới của danh sáchCuối cùng, đối với bất kỳ trường hợp nào khác (dòng 9), bạn nên theo dõi nút được kiểm tra lần cuối bằng cách sử dụng biến 824. Sau đó, khi bạn tìm thấy nút đích, bạn có thể sử dụng biến 824 đó để viết lại các giá trị 1Một lần nữa, một ví dụ đáng giá ngàn lời nói >>> 3Với 820, giờ đây bạn có tất cả các phương pháp cần thiết để chèn các nút vào bất kỳ đâu bạn muốn trong danh sách của mìnhLoại bỏ các quảng cáoLàm thế nào để loại bỏ 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 duyệt qua danh sách cho đến khi 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à nút tiếp theo của nó. Liên kết lại này là thứ 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 duyệt qua danh sách. Hãy xem một triển khai ví dụ 4Trong đoạn mã trên, trước tiên bạn kiểm tra xem danh sách của bạn có trống không (dòng 2). Nếu đúng như vậy, thì bạn đưa ra một ngoại lệ. Sau đó, bạn kiểm tra xem nút cần xóa có phải là 0 hiện tại của danh sách không (dòng 5). Nếu đúng như vậy, thì bạn muốn nút tiếp theo trong danh sách trở thành 0 mớiNếu không có điều nào ở trên xảy ra, thì bạn bắt đầu duyệt qua danh sách để tìm nút cần 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 đó để 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 duyệt qua toàn bộ danh sách mà không tìm thấy nút cần xóa (dòng 16), thì bạn đã đưa ra một ngoại lệ Lưu ý rằng trong đoạn mã trên, bạn sử dụng 830 để 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 cần xóaĐây là một ví dụ sử dụng một danh sách >>> 5Đó là nó. Bây giờ bạn đã biết cách triển khai danh sách được liên kết và tất cả các phương thức chính để duyệt, chèn và xóa nút. Nếu bạn cảm thấy thoải mái với những gì mình đã học và bạn khao khát nhiều hơn nữa, thì hãy thoải mái chọn một trong những thử thách bên dưới
Ngoài việc là một phương pháp luyện tập tuyệt vời, việc tự mình thực hiện một số thử thách bổ sung là một cách hiệu quả để tiếp thu tất cả kiến thức bạn đã thu đượ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 Lấy mã nguồn. Nhấp vào đây để lấy mã nguồn mà bạn sẽ sử dụng để tìm hiểu về danh sách được liên kết trong hướng dẫn này Sử dụng danh sách 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 liên kết cụ thể được gọi là danh sách liên kết đơn. Nhưng có nhiều loại danh sách được liên kết hơn có thể được sử dụng cho các mục đích hơi khác nhau Cách sử dụng danh sách liên kết képDanh sách liên kết đôi khác với danh sách liên kết đơn ở chỗ chúng có hai tham chiếu
Kết quả cuối cùng trông như thế này Nút (Danh sách liên kết đôi)Nếu bạn muốn triển khai những điều trên, thì bạn có thể thực hiện một số thay đổi đối với lớp 35 hiện tại của mình để bao gồm trường 837 6Kiểu triển khai này sẽ cho phép bạn duyệt qua danh sách theo cả hai hướng thay vì chỉ duyệt qua bằng cách sử dụng 1. Bạn có thể sử dụng 1 để đi tiếp và 837 để đi lùiVề mặt cấu trúc, đây là cách một danh sách liên kết đôi trông như thế nào Danh sách liên kết đôiTrước đó bạn đã biết rằng 9 sử dụng danh sách được liên kết như một phần cấu trúc dữ liệu của nó. Đây là loại. Với danh sách liên kết kép, 34 có khả năng chèn hoặc xóa các phần tử ở cả hai đầu của hàng đợi với hiệu suất O(1) không đổiLoại bỏ các quảng cáoCách sử dụng danh sách liên kết vòngDanh sách liên kết vòng là một loại danh sách được liên kết trong đó nút cuối cùng trỏ về 0 của danh sách thay vì trỏ đến 2. Đây là những gì làm cho chúng hình tròn. Danh sách liên kết vòng có khá nhiều trường hợp sử dụng thú vị
Đây là giao diện của một danh sách liên kết vòng Danh sách liên kết vòngMột trong những ưu điểm của danh sách liên kết vòng là bạn có thể duyệt qua toàn bộ danh sách bắt đầu từ bất kỳ nút nào. Vì nút cuối cùng trỏ đến 0 của danh sách, bạn cần đảm bảo rằng bạn sẽ dừng duyệt 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ạnVề mặt triển khai, danh sách liên kết vòng rất giống với danh sách liên kết đơn. Sự khác biệt duy nhất là bạn có thể xác định điểm bắt đầu khi duyệt qua danh sách 7Duyệt qua danh sách bây giờ nhận được một đối số bổ sung, 849, được sử dụng để xác định điểm bắt đầu và (vì danh sách là vòng tròn) kết thúc quá trình lặp. Ngoài ra, phần lớn mã giống với những gì chúng tôi đã có trong lớp 34 của mìnhĐể 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 như thế nào 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 khi lướt qua danh sách. Đó là bởi vì không có kết thúc cụ thể cho một danh sách vòng 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áchPhần kết luậnTrong bài viết này, bạn đã học được khá nhiều điều. quan trọng nhất là
Nếu bạn muốn tìm hiểu thêm về danh sách được liên kết, hãy xem bài đăng trên Trung bình của Vaidehi Joshi để có giải thích trực quan hay. Nếu bạn quan tâm đến hướng dẫn sâu hơn, thì bài viết trên 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ủ đề của Raymond HettingerBạn có thể tải xuống mã nguồn được sử dụng trong hướng dẫn này bằng cách nhấp vào liên kết sau Lấy mã nguồn. Nhấp vào đây để lấy mã nguồn mà bạn sẽ sử dụng để tìm hiểu về danh sách được liên kết trong hướng dẫn này Hãy để lại bất kỳ câu hỏi hoặc ý kiến dưới đây. Python hạnh phúc Đánh dấu là đã hoàn thành Xem ngay Hướng dẫn này có một khóa học video liên quan do nhóm Real Python tạo. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn. Làm việc với danh sách được liên kết trong Python 🐍 Thủ thuật Python 💌 Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python Gửi cho tôi thủ thuật Python » Giới thiệu về Pedro Pregueiro Xin chào. Tên tôi là Pedro và tôi là nhà phát triển Python yêu thích viết mã, bánh mì kẹp thịt và chơi ghi-ta » Thông tin thêm về PedroMỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là Aldren Geir Arne Jim Joanna Gia-cốp Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia Nâng cao kỹ năng Python của bạn » Bậc thầy Kỹ năng Python trong thế giới thực Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia Nâng cao kỹ năng Python của bạn » Bạn nghĩ sao? Đánh giá bài viết này Tweet Chia sẻ Chia sẻ EmailBài học số 1 hoặc điều yêu thích mà bạn đã học được là gì? Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi Danh sách Python là 0 hay 1?danh sách python được 0 lập chỉ mục . Vì vậy, phần tử đầu tiên là 0, thứ hai là 1, v.v. Vì vậy, nếu có n phần tử trong danh sách, phần tử cuối cùng là n-1.
Danh sách 0 có được lập chỉ mục không?Danh sách “không được lập chỉ mục” , vì vậy [0] trả về thứ 0 (i. e. mục ngoài cùng bên trái) trong danh sách và [1] trả về mục thứ một (i. e. một mục ở bên phải của mục thứ 0).
Độ dài của danh sách O là 1?len là O(1) vì trong RAM của bạn, các danh sách được lưu trữ dưới dạng bảng (chuỗi địa chỉ liền kề). Để biết khi nào bàn dừng máy tính cần hai điều. chiều dài và điểm bắt đầu. Chính vì vậy len() là O(1), máy tính lưu giá trị nên chỉ cần tra cứu.
[. ] trong Python?[. ] là cú pháp lát mảng cho mọi phần tử trong mảng . Câu trả lời này ở đây đi sâu hơn vào việc sử dụng chung. Giải thích ký hiệu lát của Python. del arr # Xóa chính mảng đó del arr[. ] # Xóa tất cả các phần tử trong mảng del arr[2] # Xóa phần tử thứ hai trong mảng del arr[1. ] # vân vân. |