Hướng dẫn why use linked list in python - tại sao lại sử dụng danh sách liên kết trong python

Trong các cấu trúc dữ liệu của người Viking trong loạt Python, tôi sẽ xem qua 6 cấu trúc dữ liệu chính sẽ xuất hiện trong bất kỳ loại cuộc phỏng vấn công việc/thực tập kỹ sư phần mềm nào. Chúng là danh sách được liên kết, ngăn xếp/hàng đợi, băm, đống và cây.

Tôi đã chọn Python làm ngôn ngữ chính cho loạt bài này vì khả năng đọc và dễ dàng trong việc thực hiện các cấu trúc dữ liệu. Trên thực tế, cả Harvard và MIT đều có các khóa học CS giới thiệu của họ được cung cấp trong Python.

Tôi sẽ bao gồm các danh sách liên kết ngày hôm nay. Bạn có thể tìm thấy mã nguồn cho các thách thức mã hóa dưới đây. Bắt đầu nào.

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

Ở đây, một hình ảnh của một danh sách được liên kết. Hai điều quan trọng cần lưu ý:

1: Danh sách được liên kết bao gồm các nút.nodes.

một nút

2: Mỗi nút bao gồm một giá trị và một con trỏ đến một nút khác.value and a pointer to another node.

một con trỏ giá trị

Nút bắt đầu của một danh sách được liên kết được gọi là tiêu đề.header.

Về cơ bản, danh sách được liên kết là một chuỗi các giá trị được kết nối với con trỏ.

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

Danh sách liên kết thường được so sánh với các mảng. Trong khi một mảng là một kích thước cố định của chuỗi, một danh sách được liên kết có thể có các yếu tố của nó được phân bổ động. Những ưu và nhược điểm của những đặc điểm này là gì? Dưới đây là một số cái chính:

Thuận lợi

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ớ. It only allocates the memory required for values to be stored. In arrays, you have to set an array size before filling it with values, which can potentially waste memory.

Các nút danh sách được liên kết có thể sống ở bất cứ đâu trong bộ nhớ. Trong khi một mảng yêu cầu một chuỗi bộ nhớ được bắt đầu, miễn là các tài liệu tham khảo được cập nhật, mỗi nút danh sách được liên kết có thể được di chuyển linh hoạt đến một địa chỉ khác nhau.Whereas an array requires a sequence of memory to be initiated, as long as the references are updated, each linked list node can be flexibly moved to a different address.

Nhược điểm

Thời gian tra cứu tuyến tính. Khi tìm kiếm một giá trị trong một danh sách được liên kết, bạn phải bắt đầu từ đầu chuỗi và kiểm tra một phần tử tại một thời điểm cho một giá trị mà bạn đang tìm kiếm. Nếu danh sách được liên kết là n yếu tố dài, điều này có thể mất đến n thời gian. Trái lại, nhiều ngôn ngữ cho phép tra cứu liên tục trong các mảng.When looking for a value in a linked list, you have to start from the beginning of chain, and check one element at a time for a value you’re looking for. If the linked list is n elements long, this can take up to n time. On the contrary many languages allow constant lookups in arrays.

Danh sách được liên kết trong Python

Tại đây, cách bạn thực hiện một danh sách được liên kết trong Python:

Đây là một lớp nút.

class Node:
def __init__[self,val]:
self.val = val
self.next = None # the pointer initially points to nothing

Khi bạn có lớp nút, bạn có thể thực hiện bất kỳ danh sách được liên kết nào như sau:

Ví dụ liên kết danh sách
node1 = Node[12] 
node2 = Node[99]
node3 = Node[37]
node1.next = node2 # 12->99
node2.next = node3 # 99->37
# the entire linked list now looks like: 12->99->37

Bạn có thể đã tự hỏi tại sao tôi đã thực hiện một lớp LinkedList. Rốt cuộc, danh sách được liên kết chỉ là một loạt các nút được kết nối với nhau. Chúng ta có thể đề cập đến một nút tiêu đề là danh sách được liên kết mà bắt đầu từ đó. Trong ví dụ trên, Node1 là nút tiêu đề và nó cũng có thể đại diện cho danh sách được liên kết bắt đầu từ nó. Nếu bạn tò mò về việc triển khai liên quan đến một lớp LinkedList, hãy xem ở đây.

Đi qua các giá trị

class Node:
...

def traverse[self]:
node = self # start from the head node
while node != None:
print node.val # access the node value
node = node.next # move on to the next node

Các giá trị có thể được đi qua như thế này. Bạn bắt đầu từ nút đầu, kiểm tra giá trị của nó và chuyển sang nút tiếp theo. Khi bạn nhấn vào phần cuối của danh sách được liên kết, nút không nên có bất kỳ giá trị nào [không có].

Lưu ý bên lề: Thật kỳ lạ khi nói về các danh sách được liên kết trong Python vì cấu trúc dữ liệu này quá thấp để có ích trong các chương trình Python. Vì vậy, don lồng đổ lỗi cho tôi nếu bạn không thấy điểm mã hóa tất cả những điều này trong Python. Rốt cuộc, có rất nhiều điểm trong việc sử dụng danh sách được liên kết trong Python bên cạnh giá trị giáo dục và tính hữu dụng của nó trong các cuộc phỏng vấn mã hóa. Trong các ngôn ngữ khác như C và C ++, trong đó các danh sách được liên kết thực sự rất quan trọng đối với bất kỳ chương trình nào bạn đang thực hiện.

[Nâng cao] Danh sách liên kết gấp đôi

Như tên cho thấy, mỗi nút trong một danh sách được liên kết gấp đôi có hai nút: một nút chỉ vào nút tiếp theo và một nút trỏ đến nút trước đó. Tại đây, việc thực hiện Python:

class DoublyNode:
def __init__[self, val]:
self.val = data
self.next = None
self.prev = None

Lợi thế so với danh sách liên kết đơn lẻ1] có thể được đi qua cả hướng tiến và lùi.2] Hoạt động xóa hiệu quả hơn [hãy xem P4 bên dưới và đối chiếu nó với hoạt động xóa cho danh sách được liên kết gấp đôi].
1] Can be traversed in both forward and backward direction.
2] The delete operation is more efficient [take a look at p4 below and contrast it with the delete operation for a doubly linked list].

Nhược điểm đối với danh sách liên kết đơn lẻ1] Mỗi ​​nút đều yêu cầu thêm không gian cho con trỏ trước.2] Tất cả các hoạt động đều yêu cầu một con trỏ thêm phải được duy trì.
1] Every node requires extra space for a previous pointer.
2] All operations require an extra pointer to be maintained.

Một số thách thức mã hóa danh sách được liên kết

Dưới đây là những thách thức để bạn làm quen với các danh sách được liên kết. Hầu hết các thử thách được thực hiện từ cuốn sách Cracking The Coding phỏng vấn.

  1. Đi qua một danh sách được liên kết
  2. Xóa các bản sao khỏi danh sách được liên kết
  3. Nhận phần tử KTH đến cuối cùng từ một danh sách được liên kết
  4. Xóa một nút khỏi danh sách được liên kết
  5. Thêm hai danh sách được liên kết từ trái sang phải, ví dụ: 1-> 2-> 3 + 8-> 7 => 321 + 78 = 399
    e.g. 1->2->3 + 8->7 => 321+78 = 399
  6. Thêm hai danh sách được liên kết từ phải sang trái, ví dụ: 1-> 2-> 3 + 8-> 7 => 123 + 87 = 210
    e.g. 1->2->3 + 8->7 => 123+87 = 210

Các giải pháp của tôi có thể được tìm thấy ở đây. Vui lòng gửi cho tôi một yêu cầu kéo hoặc để lại nhận xét ở đây nếu bạn có bất kỳ câu hỏi hoặc tìm thấy sai lầm nào trong các giải pháp của tôi.

Trong bài tiếp theo, tôi sẽ bao gồm các ngăn xếp và hàng đợi.

Tại sao tôi sẽ sử dụng một 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ớ.saves memory. It only allocates the memory required for values to be stored. In arrays, you have to set an array size before filling it with values, which can potentially waste memory.

Mục đích của việc sử dụng danh sách được liên kết là gì?

Danh sách được liên kết là các cấu trúc dữ liệu tuyến tính giữ dữ liệu trong các đối tượng riêng lẻ được gọi là nút.Các nút này chứa cả dữ liệu và tham chiếu đến nút tiếp theo trong danh sách.Danh sách được liên kết thường được sử dụng vì chèn và xóa hiệu quả của chúng.efficient insertion and deletion.

Tại sao chúng ta thích danh sách được liên kết?

Trong một danh sách được liên kết, các hoạt động chèn và xóa khá dễ dàng, vì không cần phải thay đổi mọi yếu tố sau khi chèn hoặc xóa.Chỉ địa chỉ có trong các gợi ý cần được cập nhật.Trong khi trong một mảng, chúng ta phải thay đổi các yếu tố.insertion and deletion operations are quite easy, as there is no need to shift every element after insertion or deletion. Only the address present in the pointers needs to be updated. While in an array, we have to shift elements.

Bài Viết Liên Quan

Chủ Đề