Làm cách nào để chuyển đổi mảng thành danh sách được liên kết trong Python?

Cụ thể là có xung đột khi tạo danh sách, nếu ListNode là một danh sách thì việc tạo danh sách sẽ được thực hiện bằng cách gọi ListNode nhưng sau đó bạn tạo một nút như thế nào…

jaccobtw

Tôi có thể lấy một danh sách và chỉ định toàn bộ nội dung được liên kết không?

ừm. hãy nhớ rằng cấu trúc của bạn khác với cấu trúc của danh sách python. Nếu bạn giữ toàn bộ danh sách thì bạn không có cấu trúc của mình, vì vậy không, đó sẽ không phải là danh sách được liên kết phải không?

Hãy nhớ rằng mục đích của việc tạo kiểu danh sách liên kết là để hiển thị các thao tác. Thông qua họ, bạn sẽ thực hiện chuyển đổi. Và chính nhờ họ mà bạn sẽ sử dụng danh sách. Và sử dụng danh sách có thể liên quan đến việc tạo danh sách

Một số cấu trúc dữ liệu bạn có thể sử dụng là các tập hợp chẳng hạn như mảng, danh sách, bản đồ, tập hợp, v.v.

Tất cả đều thực hiện công việc tuyệt vời là lưu trữ và truy cập dữ liệu, nhưng đôi khi bạn có thể cần một cái gì đó khác. Một cấu trúc dữ liệu khác thường được sử dụng được gọi là Danh sách liên kết

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

Danh sách được liên kết là một cấu trúc dữ liệu lưu trữ dữ liệu dưới dạng chuỗi. Cấu trúc của danh sách được liên kết sao cho mỗi phần dữ liệu có kết nối với phần tiếp theo [và đôi khi cả dữ liệu trước đó]. Mỗi phần tử trong danh sách liên kết được gọi là một nút

Bạn có thể coi nó như một chuỗi thực tế, trong đó mỗi vòng hoặc nút được kết nối với nhau.
Đại loại như thế này

Giống như mọi cấu trúc dữ liệu khác, danh sách được liên kết có ưu và nhược điểm của chúng

Ưu điểm của danh sách liên kết

  1. Do hệ thống danh sách liên kết giống như chuỗi, bạn có thể thêm và xóa các phần tử một cách nhanh chóng. Điều này cũng không yêu cầu tổ chức lại cấu trúc dữ liệu không giống như mảng hoặc danh sách. Cấu trúc dữ liệu tuyến tính thường dễ triển khai hơn bằng cách sử dụng danh sách được liên kết
  2. Danh sách được liên kết cũng không yêu cầu kích thước cố định hoặc kích thước ban đầu do cấu trúc dạng chuỗi của chúng

Nhược điểm của danh sách liên kết

  1. Cần nhiều bộ nhớ hơn khi so sánh với một mảng. Điều này là do bạn cần một con trỏ [chiếm bộ nhớ của chính nó] để trỏ bạn đến phần tử tiếp theo
  2. Thao tác tìm kiếm trên danh sách liên kết rất chậm. Không giống như một mảng, bạn không có tùy chọn truy cập ngẫu nhiên

Khi nào bạn nên sử dụng danh sách liên kết?

Bạn nên sử dụng danh sách liên kết trên một mảng khi

  1. Bạn không biết có bao nhiêu mục sẽ có trong danh sách [đó là một trong những lợi thế - dễ dàng thêm mục]
  2. Bạn không cần truy cập ngẫu nhiên vào bất kỳ phần tử nào [không giống như mảng, bạn không thể truy cập phần tử tại một chỉ mục cụ thể trong danh sách được liên kết]
  3. Bạn muốn có thể chèn các mục vào giữa danh sách
  4. Bạn cần chèn/xóa thời gian liên tục khỏi danh sách [không giống như một mảng, trước tiên bạn không phải thay đổi mọi mục khác trong danh sách]

Đây là một vài điều bạn nên xem xét trước khi thử triển khai danh sách được liên kết

Bây giờ với tất cả lý thuyết đã hết, đã đến lúc thực hiện một. Chúng ta sẽ làm điều này bằng Python, nhưng hầu hết những gì chúng ta tìm hiểu ở đây đều áp dụng cho bất kỳ ngôn ngữ nào bạn đang sử dụng. Điều quan trọng nhất là phải hiểu nó hoạt động như thế nào

Cách sử dụng danh sách liên kết trong Python

Đây là một thủ thuật khi tạo Danh sách liên kết. Đó là điều đã giúp tôi hiểu nó tốt hơn nhiều

Bạn chỉ cần nhận ra rằng mọi mục mà bạn sẽ thêm vào danh sách chỉ là một nút [tương tự như một vòng trong chuỗi]. Điểm khác biệt của phần đầu [là nút đầu tiên trong danh sách] là bạn đã đặt cho nó phần đầu tiêu đề và sau đó bạn bắt đầu thêm các nút khác vào đó

Hãy nhớ rằng Danh sách được liên kết tương tự như cách một chuỗi được ghép nối với nhau.
Joe đang ở đây với vài chiếc nhẫn và anh ấy sẽ giúp chúng ta.

Tôi sẽ sử dụng điều này để minh họa khi chúng ta đi. để bạn có thể suy nghĩ theo những dòng này [đây không phải là một lớp nghệ thuật – tôi nhắc lại, đây không phải là một lớp nghệ thuật. ] ]

Vì vậy, trước tiên hãy tạo các nút

class Node:    
	def __init__[self,value]:        
		self.value = value        
		self.next = None


đó là nó. Chúng tôi thêm

class LinkedList:
	def __init__[self,head=None]:
		self.head = head    
		def append[self, new_node]:
            current = self.head
            if current:
                while current.next:
                    current = current.next
                current.next = new_node
            else:
                self.head = new_node
2 vì đối với bất kỳ thứ gì được thêm vào danh sách được liên kết, ít nhất nó phải có một số giá trị [ví dụ: ngoại trừ trong một số trường hợp hiếm gặp, bạn không thêm một chuỗi trống vào một mảng, phải không?]

class LinkedList:
	def __init__[self,head=None]:
		self.head = head    
		def append[self, new_node]:
            current = self.head
            if current:
                while current.next:
                    current = current.next
                current.next = new_node
            else:
                self.head = new_node
3 có nghĩa là có thể chúng tôi muốn xâu chuỗi các nút khác - ý tôi là, đó là mục đích chính của danh sách được liên kết

Tiếp theo chúng ta sẽ định nghĩa một số chức năng cơ bản

class LinkedList:
	def __init__[self,head=None]:
		self.head = head    
		def append[self, new_node]:
            current = self.head
            if current:
                while current.next:
                    current = current.next
                current.next = new_node
            else:
                self.head = new_node


Phương thức

class LinkedList:
	def __init__[self,head=None]:
		self.head = head    
		def append[self, new_node]:
            current = self.head
            if current:
                while current.next:
                    current = current.next
                current.next = new_node
            else:
                self.head = new_node
4 cho phép bạn thêm một nút mới vào danh sách. Hãy khám phá cách nó hoạt động

Nếu tôi có hai giá trị – giả sử 1 và 2 – và tôi muốn thêm chúng vào danh sách, điều đầu tiên là xác định chúng dưới dạng các nút riêng lẻ [nghĩa là dưới dạng các vòng của chuỗi]. tôi có thể làm điều đó như thế này

e1 = Node[1]
e2 = Node[2]

Bây giờ tôi có thể định nghĩa một danh sách được liên kết vì tôi đã có sẵn các nút của mình. Một danh sách được liên kết [giống như các chuỗi chúng ta thấy – luôn có phần đầu, phải không?], vì vậy tôi có thể xác định danh sách được liên kết của mình với một giá trị phần đầu mà về cơ bản chỉ là một nút [vòng] khác

ll = LinkedList[e1]

Bây giờ từ đoạn mã trên,

class LinkedList:
	def __init__[self,head=None]:
		self.head = head    
		def append[self, new_node]:
            current = self.head
            if current:
                while current.next:
                    current = current.next
                current.next = new_node
            else:
                self.head = new_node
0 là phần đầu của danh sách được liên kết, đây chỉ là một cách thú vị để nói điểm bắt đầu của danh sách được liên kết của tôi. Tôi có thể thêm nhiều mục hơn vào nó và vì mỗi chuỗi phải được kết nối [nghĩa là bên trong nhau], trước tiên tôi phải thiết lập trường hợp cơ sở để kiểm tra xem danh sách có phần đầu không

Điều tạo nên một danh sách liên kết là nó có một điểm bắt đầu. Nếu không, chúng ta chỉ cần đặt phần tử mới vào đầu. Nhưng nếu nó đã có phần đầu, tôi phải xem qua toàn bộ danh sách và tiếp tục kiểm tra xem có nút nào có

class LinkedList:
	def __init__[self,head=None]:
		self.head = head    
		def append[self, new_node]:
            current = self.head
            if current:
                while current.next:
                    current = current.next
                current.next = new_node
            else:
                self.head = new_node
3 trống không [nghĩa là,
class LinkedList:
	def __init__[self,head=None]:
		self.head = head    
		def append[self, new_node]:
            current = self.head
            if current:
                while current.next:
                    current = current.next
                current.next = new_node
            else:
                self.head = new_node
2]

Một lần nữa, danh sách được liên kết giống như một chuỗi, phải không? . Khi một nút có nút tiếp theo là

class LinkedList:
	def __init__[self,head=None]:
		self.head = head    
		def append[self, new_node]:
            current = self.head
            if current:
                while current.next:
                    current = current.next
                current.next = new_node
            else:
                self.head = new_node
4, điều đó đơn giản có nghĩa là nút đó ở cuối danh sách. Vì vậy, tôi có thể dễ dàng thêm nút mới vào vị trí đó.

Hãy tạo một phương thức để xóa một nút. Nhưng trước khi làm, hãy nghĩ về nó trong giây lát. Hãy tưởng tượng bạn có một sợi dây xích và bạn phát hiện ra một chiếc nhẫn yếu. Bạn làm nghề gì?

Trước tiên, bạn tìm chiếc nhẫn yếu, sau đó bạn tháo nó ra và nối chiếc trước và chiếc sau lại với nhau. Nhưng nếu vòng yếu là vòng đầu tiên, điều đó thật dễ dàng – bạn chỉ cần xóa nó và không thực sự phải tham gia bất kỳ thứ gì. Vòng thứ hai tự động trở thành đầu của chuỗi. Hãy thử hình dung điều đó

Chúng tôi muốn làm điều tương tự ở đây. Vì vậy, trước tiên chúng tôi tìm vòng yếu – trong trường hợp này sẽ là giá trị mà chúng tôi đang tìm kiếm – và sau đó chúng tôi sẽ lấy cái trước và cái sau và nối chúng lại với nhau

class LinkedList:    
	def __init[...]    
	def append[...]    
	  def delete[self, value]:
        """Delete the first node with a given value."""
        current = self.head
        if current.value == value:
            self.head = current.next
        else:
            while current:
                if current.value == value:
                    break
                prev = current
                current = current.next
            if current == None:
                return
            prev.next = current.next
            current = None

Vì vậy, những gì chúng tôi đang làm ở đây chỉ đơn giản là đi qua từng nút để xem liệu đó có phải là giá trị mà chúng tôi muốn xóa hay không. Nhưng khi chúng tôi di chuyển qua danh sách, chúng tôi phải theo dõi giá trị trước đó [chúng tôi vẫn phải nối lại danh sách với nhau]. Chúng tôi làm điều này với

class LinkedList:
	def __init__[self,head=None]:
		self.head = head    
		def append[self, new_node]:
            current = self.head
            if current:
                while current.next:
                    current = current.next
                current.next = new_node
            else:
                self.head = new_node
5 như bạn có thể thấy bên trên hoặc bên dưới. ]

Vì vậy, khi nút đã được tìm thấy,

class LinkedList:
	def __init__[self,head=None]:
		self.head = head    
		def append[self, new_node]:
            current = self.head
            if current:
                while current.next:
                    current = current.next
                current.next = new_node
            else:
                self.head = new_node
6 chứa nút trước nó, có thể dễ dàng chuyển đổi [nghĩa là giá trị tiếp theo] để trỏ đến một nút khác – trong trường hợp này là các nút khác được kết nối với nút mà chúng tôi muốn xóa. Tôi hy vọng điều này có ý nghĩa. ]

Hãy thực hiện việc chèn một nút vào một vị trí cụ thể. Chúng tôi sẽ sử dụng phép loại suy chuỗi của chúng tôi để hiểu điều này tốt hơn

Khi bạn giữ một sợi xích và bạn thực sự muốn tăng chiều dài của sợi xích, bạn có ba lựa chọn. Bạn có thể

  1. Thêm một liên kết [phần tử] vào đầu chuỗi [điều này khá đơn giản phải không?]
  2. Thêm nó vào cuối chuỗi [tương tự như 1]
  3. Hoặc bạn có thể thêm nó vào bất kỳ điểm nào ở giữa [phức tạp hơn một chút]

Một điều bạn nên ghi nhớ là bất cứ nơi nào bạn quyết định thêm nó, bạn phải nối các nút khác trở lại với nó. Điều đó chỉ khả thi nếu bạn theo dõi các nút khác bằng một vòng lặp

Hãy xem điều đó trong hành động

class LinkedList:
	def __init__[self,head=None]:
		self.head = head    
		def append[self, new_node]:
            current = self.head
            if current:
                while current.next:
                    current = current.next
                current.next = new_node
            else:
                self.head = new_node
0

Chúng tôi được cung cấp một vị trí để chèn nút trong mã ở trên. Nếu vị trí là một, có nghĩa là nó sẽ là gốc. Vì chúng tôi không chắc lắm, chúng tôi có thể khởi tạo một vòng lặp và bộ đếm để theo dõi vòng lặp

Nếu vị trí chúng ta chèn là một [nghĩa là gốc], chỉ cần lưu gốc hiện tại vào một biến giả, tạo một gốc mới, sau đó thêm gốc trước đó [nghĩa là toàn bộ chuỗi] vào gốc mới này

Nếu vị trí không phải là một, hãy tiếp tục đi qua chuỗi cho đến khi bạn tìm thấy vị trí.

Cuối cùng đối với bài viết này, chúng ta hãy bắt đầu hiển thị các giá trị của danh sách được liên kết của chúng ta ở bất kỳ định dạng nào bạn muốn – ví dụ: in ra hoặc thêm danh sách đó vào bộ sưu tập danh sách. Tôi sẽ chỉ in các giá trị ra.

Điều này khá đơn giản, tương tự như chuỗi vật lý. bạn chỉ cần nhìn qua mọi nơi có một nút và lấy giá trị, sau đó chuyển sang nút tiếp theo

class LinkedList:
	def __init__[self,head=None]:
		self.head = head    
		def append[self, new_node]:
            current = self.head
            if current:
                while current.next:
                    current = current.next
                current.next = new_node
            else:
                self.head = new_node
1

Vì vậy, đó là tất cả trên danh sách được liên kết cho đến bây giờ. Chúng tôi sẽ làm việc để giải quyết một số câu hỏi về danh sách được liên kết sau này

kết thúc

Trong bài viết này, tôi đã giải thích

  • Cách hoạt động của danh sách liên kết
  • Ưu nhược điểm của danh sách liên kết
  • Cách triển khai danh sách liên kết với Python


Bạn có thể tìm thấy mã cho bài viết này ở đây. Cảm ơn bạn đã đọc

QUẢNG CÁO

QUẢNG CÁO

QUẢNG CÁO

QUẢNG CÁO

QUẢNG CÁO

QUẢNG CÁO

QUẢNG CÁO

QUẢNG CÁO

QUẢNG CÁO

Fakorede Damilola

Đọc thêm bài viết

Nếu bài viết này hữu ích, hãy tweet nó

Học cách viết mã miễn phí. Chương trình giảng dạy mã nguồn mở của freeCodeCamp đã giúp hơn 40.000 người có được việc làm với tư cách là nhà phát triển. Bắt đầu

Làm cách nào để chuyển đổi danh sách mảng thành danh sách được liên kết?

Thuật toán. .
Nhận ArrayList để được chuyển đổi
Tạo một LinkedList trống
Lặp lại các mục trong ArrayList
Đối với mỗi mục, hãy thêm nó vào LinkedList
Trả lại LinkedList đã hình thành

Chúng ta có thể tạo danh sách liên kết bằng cách sử dụng mảng không?

Mảng danh sách liên kết là một cấu trúc dữ liệu quan trọng có thể được sử dụng trong nhiều ứng dụng . Về mặt khái niệm, một mảng các danh sách được liên kết trông như sau. Mảng danh sách liên kết là một cấu trúc thú vị vì nó kết hợp cấu trúc tĩnh [mảng] và cấu trúc động [danh sách liên kết] để tạo thành một cấu trúc dữ liệu hữu ích.

Bạn có thể tạo danh sách liên kết bằng Python không?

Danh sách liên kết là một dãy các phần tử dữ liệu được kết nối với nhau thông qua các liên kết. Mỗi phần tử dữ liệu chứa một kết nối đến một phần tử dữ liệu khác dưới dạng một con trỏ. Python không có danh sách liên kết trong thư viện chuẩn của nó

Chủ Đề