Python Singlelinkedlistnode

Nếu tôi đã tạo một danh sách các nút được liên kết có thuộc tính value, có cách nào để in tất cả các thuộc tính value cho tất cả các nút trong danh sách được liên kết bằng cách sử dụng vòng lặp while không?

[Chỉnh sửa] Ngoài ra, làm cách nào tôi có thể gọi phương thức ma thuật iter để tôi có thể lặp lại và in qua danh sách được liên kết?

[Tôi xin lỗi nếu có điều gì đó cơ bản, về mặt khái niệm, mà tôi không hiểu theo cách hiểu của mình]

Dưới đây là mã cho các nút và danh sách liên kết đơn lẻ mà tôi đã thiết lập và bạn sẽ thấy rằng tôi đã in từng giá trị cho từng nút ở dưới cùng. Tuy nhiên, tôi không chắc liệu có cách nào đơn giản để in tất cả các giá trị một cách dễ dàng hay không, thay vì liệt kê từng giá trị

Một trong những phần khó nhất khi trở thành nhà phát triển web mà không có bằng CS [ngoài những điều hiển nhiên] là tự học cấu trúc dữ liệu và thuật toán

Rất nhiều lập trình viên tự học không nhận ra tầm quan trọng của những khái niệm này cho đến khi họ đã có sẵn một cuộc phỏng vấn, và lúc đó thì đã quá muộn. Tôi đã may mắn được tham dự Chương trình tăng tốc phát triển Python của Code Fellows, nơi một phần của chương trình giảng dạy được dành riêng cho các thuật toán và cấu trúc dữ liệu cơ bản. Nhưng tám tuần quay cuồng không đủ để củng cố những khái niệm này, vì vậy tôi nghĩ sẽ có ích, cho cả sự biên tập của riêng tôi và cho các Pythonistas mới chớm nở khác, để viết một loạt bài về cấu trúc dữ liệu cơ bản, bắt đầu với danh sách được liên kết

Ở dạng cơ bản nhất, danh sách được liên kết là một chuỗi các nút, giống như một chuỗi ngọc trai, với mỗi nút chứa cả dữ liệu và tham chiếu đến nút tiếp theo trong danh sách [Lưu ý. Đây là danh sách liên kết đơn. Các nút trong danh sách liên kết kép sẽ chứa các tham chiếu đến cả nút tiếp theo và nút trước đó]. Ưu điểm chính của việc sử dụng danh sách được liên kết trên một cấu trúc dữ liệu tương tự, như mảng tĩnh, là cấp phát bộ nhớ động của danh sách được liên kết. nếu bạn không biết trước lượng dữ liệu bạn muốn lưu trữ, danh sách được liên kết có thể điều chỉnh nhanh chóng. * Tất nhiên lợi thế này có giá. cấp phát bộ nhớ động yêu cầu nhiều không gian hơn và thời gian tra cứu lệnh chậm hơn

* Trong thực tế, điều này có nghĩa là một số phần chèn đắt hơn. Ví dụ: nếu danh sách ban đầu phân bổ đủ không gian cho 8 nút, thì ở lần chèn thứ chín, danh sách sẽ phải nhân đôi không gian được phân bổ của nó lên 16 và sao chép qua 8 nút ban đầu, một thao tác tốn kém hơn so với thao tác chèn thông thường

nút

Nút là nơi dữ liệu được lưu trữ trong danh sách được liên kết [chúng làm tôi nhớ đến những quả trứng Phục sinh bằng nhựa đựng đồ ăn vặt]. Cùng với dữ liệu, mỗi nút cũng chứa một con trỏ, là tham chiếu đến nút tiếp theo trong danh sách. Dưới đây là một thực hiện đơn giản

class Node[object]:

    def __init__[self, data=None, next_node=None]:
        self.data = data
        self.next_node = next_node

    def get_data[self]:
        return self.data

    def get_next[self]:
        return self.next_node

    def set_next[self, new_next]:
        self.next_node = new_next

Nút khởi tạo với một mốc thời gian duy nhất và con trỏ của nó được đặt thành Không theo mặc định [điều này là do nút đầu tiên được chèn vào danh sách sẽ không có gì để trỏ tới. ]. Chúng tôi cũng thêm một vài phương pháp tiện lợi. một cái trả về dữ liệu được lưu trữ, một cái khác trả về nút tiếp theo [nút mà nút đối tượng trỏ tới] và cuối cùng là một phương thức để đặt lại con trỏ thành một nút mới. Những thứ này sẽ có ích khi chúng ta triển khai Danh sách được liên kết

Danh sách liên kết

Việc triển khai danh sách liên kết đơn giản của tôi bao gồm các phương pháp sau

  • Chèn. chèn một nút mới vào danh sách

  • Kích thước. trả về kích thước của danh sách

  • Tìm kiếm. danh sách tìm kiếm nút chứa dữ liệu được yêu cầu và trả về nút đó nếu tìm thấy, nếu không sẽ phát sinh lỗi

  • Xóa bỏ. danh sách tìm kiếm một nút chứa dữ liệu được yêu cầu và xóa nó khỏi danh sách nếu tìm thấy, nếu không sẽ gây ra lỗi

Người đứng đầu danh sách

Phần kiến ​​trúc đầu tiên của danh sách được liên kết là 'nút đầu', đơn giản là nút trên cùng trong danh sách. Khi danh sách được khởi tạo lần đầu tiên, nó không có nút nào, vì vậy phần đầu được đặt thành Không có. [Ghi chú. danh sách được liên kết không nhất thiết phải có một nút để khởi tạo. Đối số đầu sẽ mặc định là Không có nếu nút không được cung cấp. ]

class LinkedList[object]:
    def __init__[self, head=None]:
        self.head = head

Chèn

Phương thức chèn này lấy dữ liệu, khởi tạo một nút mới với dữ liệu đã cho và thêm nó vào danh sách. Về mặt kỹ thuật, bạn có thể chèn một nút vào bất kỳ đâu trong danh sách, nhưng cách đơn giản nhất để làm điều đó là đặt nút đó ở đầu danh sách và trỏ nút mới vào đầu cũ [đại loại là đẩy các nút khác xuống dòng]

Đối với độ phức tạp về thời gian, việc thực hiện thao tác chèn này là hằng số O[1] [hiệu quả. ]. Điều này là do phương pháp chèn, bất kể là gì, sẽ luôn mất cùng một khoảng thời gian. nó chỉ có thể lấy một điểm dữ liệu, nó chỉ có thể tạo một nút và nút mới không cần tương tác với tất cả các nút khác trong danh sách, nút được chèn sẽ chỉ tương tác với phần đầu

def insert[self, data]:
    new_node = Node[data]
    new_node.set_next[self.head]
    self.head = new_node

Kích thước

Phương pháp kích thước rất đơn giản, về cơ bản, nó đếm các nút cho đến khi không thể tìm thấy nữa và trả về số nút đã tìm thấy. Phương thức bắt đầu tại nút đầu, di chuyển xuống dòng các nút cho đến khi đến cuối [dòng hiện tại sẽ là Không có khi nó đi đến cuối] trong khi theo dõi xem nó đã nhìn thấy bao nhiêu nút

Độ phức tạp thời gian của kích thước là O[n] vì mỗi lần phương thức được gọi, nó sẽ luôn truy cập mọi nút trong danh sách nhưng chỉ tương tác với chúng một lần, vì vậy n * 1 thao tác

def size[self]:
    current = self.head
    count = 0
    while current:
        count += 1
        current = current.get_next[]
    return count

Tìm kiếm

Tìm kiếm thực sự rất giống với kích thước, nhưng thay vì duyệt qua toàn bộ danh sách các nút, nó sẽ kiểm tra tại mỗi điểm dừng để xem liệu nút hiện tại có dữ liệu được yêu cầu hay không và nếu có, trả về nút đang giữ dữ liệu đó. Nếu phương thức đi qua toàn bộ danh sách nhưng vẫn không tìm thấy dữ liệu, nó sẽ phát sinh lỗi giá trị và thông báo cho người dùng rằng dữ liệu không có trong danh sách

Độ phức tạp về thời gian của tìm kiếm là O[n] trong trường hợp xấu nhất [bạn thường nghe về trường hợp tốt nhất/trường hợp trung bình/trường hợp xấu nhất khi phân tích Big O. Với mục đích của bài đăng trên blog này, chúng tôi sẽ cho rằng trường hợp xấu nhất là trường hợp chúng tôi quan tâm, bởi vì nó thường là. ]

def search[self, data]:
    current = self.head
    found = False
    while current and found is False:
        if current.get_data[] == data:
            found = True
        else:
            current = current.get_next[]
    if current is None:
        raise ValueError["Data not in list"]
    return current

Xóa bỏ

Bạn sẽ rất vui khi biết rằng xóa rất giống với tìm kiếm. Phương thức xóa duyệt qua danh sách giống như cách tìm kiếm, nhưng ngoài việc theo dõi nút hiện tại, phương thức xóa còn ghi nhớ nút cuối cùng mà nó đã truy cập. Khi quá trình xóa cuối cùng đến nút mà nó muốn xóa, nó chỉ cần xóa nút đó khỏi chuỗi bằng cách “nhảy cóc” nó. Điều này có nghĩa là khi phương thức xóa đến nút mà nó muốn xóa, nó sẽ xem xét nút cuối cùng mà nó đã truy cập [nút 'trước'] và đặt lại con trỏ của nút trước đó sao cho, thay vì trỏ đến nút sắp sửa . Vì không có nút nào trỏ đến nút kém đang bị xóa, nên nó sẽ bị xóa khỏi danh sách một cách hiệu quả

Độ phức tạp về thời gian để xóa cũng là O[n], vì trong trường hợp xấu nhất, nó sẽ truy cập mọi nút, tương tác với mỗi nút một số lần cố định

def delete[self, data]:
    current = self.head
    previous = None
    found = False
    while current and found is False:
        if current.get_data[] == data:
            found = True
        else:
            previous = current
            current = current.get_next[]
    if current is None:
        raise ValueError["Data not in list"]
    if previous is None:
        self.head = current.get_next[]
    else:
        previous.set_next[current.get_next[]]

Điều đó kết thúc việc thực hiện danh sách được liên kết. Nếu tôi mắc lỗi, vui lòng gửi email cho tôi. Ở dưới cùng, tôi đã cung cấp một liên kết đến mã nguồn và cũng đã thêm một bộ thử nghiệm để kiểm tra tất cả các chức năng được mô tả trong bài đăng trên blog này. Mã hóa vui vẻ

Sẵn sàng để trở thành một lập trình viên Python chuyên nghiệp?

Tài nguyên & Tín dụng Nguồn LinkedList + Kiểm tra LinkedList

Giải quyết vấn đề bằng thuật toán và cấu trúc dữ liệu bằng Python — Ngoài Code Fellows, tôi đã học được rất nhiều về danh sách liên kết từ cuốn sách này. Nó rất tốt và đoạn mã trên được lấy cảm hứng rất nhiều từ việc triển khai của họ

Bài viết này được đăng lại với sự cho phép của tác giả. Xem bài viết gốc và tìm thêm tài nguyên trên blog của John

Bài tiếp theo Bài trước

Thông tin về các Tác giả

John rùng mình

John là một nhà phát triển web có trụ sở tại Seattle, tập trung vào Python và Django. Là một sinh viên mới tốt nghiệp Chương trình tăng tốc phát triển Python của Code Fellows, anh ấy dành phần lớn thời gian để hack các dự án web và học các kỹ năng phát triển mới. Trong thời gian rảnh rỗi, anh ấy là một người tích cực chạy bộ, ham đọc sách và dành nhiều thời gian hơn anh ấy quan tâm để thừa nhận là nghe những đĩa hát cũ của Beatles

Danh sách liên kết đơn trong Python là gì?

Trong danh sách liên kết đơn mỗi nút chỉ trỏ tới nút tiếp theo . Mặt khác, trong Danh sách liên kết kép, mỗi nút trỏ đến nút tiếp theo cũng như nút trước đó. quản lý bộ nhớ hiệu quả hơn, đặc biệt là khi số lượng phần tử không xác định [nếu là mảng, bạn có thể phải liên tục thu nhỏ hoặc tăng chúng.

Python có danh sách liên kết tích hợp không?

Danh sách liên kết trong Python. Để bắt đầu với Python, nó không tích hợp sẵn thư viện danh sách liên kết như các ngôn ngữ lập trình cổ điển. Python có một danh sách kiểu sẵn có hoạt động như một mảng động nhưng không nên nhầm lẫn hoạt động của nó với một chức năng điển hình của danh sách được liên kết.

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

Danh sách liên kết đơn là gì? . Trong danh sách liên kết đơn, mỗi nút chỉ liên kết với nút tiếp theo trong dãy, i. e nếu chúng ta bắt đầu duyệt từ nút đầu tiên của danh sách, chúng ta chỉ có thể di chuyển theo một hướng [ý định chơi chữ]. a specialized case of a generic linked list. In a singly linked list, each node links to only the next node in the sequence, i.e if we start traversing from the first node of the list, we can only move in one direction[pun intended].

Listnode tùy chọn trong Python là gì?

Đó là cho phép các giá trị có thể là Không có . Ví dụ. Đây là tất cả các nút danh sách. [3 -> 1 -> Không] Ví dụ. # Sử dụng Tùy chọn [] cho các giá trị có thể là Không có x. Tùy chọn[str] = some_function[]

Chủ Đề