接続リスト
14348 ワード
接続リストの定義
📚 CLASS宣言
# 노드 CLASS 선언
class Node:
def __init__(self, data):
self.data = data
self.next = None
# 연결 리스트 CLASS 선언
class LinkedList:
def __init__(self):
self.head = None
self.count = 0
接続リストの利点
接続リストの長さを動的に調整できます
簡単にデータを挿入/削除
接続リストの欠点
任意のノードに直接アクセスできません.
次のノードの位置を格納するには、追加のスペースが必要です.
Cache Localityが近いデータをキャッシュに保存するのは難しい
接続リストをリバースブラウズできません
📚 シナリオVS接続リスト
配列された物理メモリアドレスは連続的であり、接続リストの物理メモリアドレスは連続的ではなくランダムである.
配列の挿入/削除にはO(n)の時間が必要であり,動的接続リストの挿入/削除にはO(1)の時間が必要である.
配列はO(1)の時間をインデックスとして各要素に容易にアクセスできる.ただし,接続リストにはO(n)の時間が必要である.(メモリと配列の接続方法が異なるため、データを検索するにはすべてのノードを巡回する必要があります.)
実装接続リスト
ノードの挿入
ノードの削除
#연결리스트의 끝부분에 새로운 노드추가
def append(self, data):
if self.head == None:
self.head = node
else:
cur = self.head
while cur,next != None:
cur = cur.next
cur.next = Node(data)
#모든 노드 값 출력
def print_all(self):
cur = self.head
while cur != None:
print(cur.data)
cur = cur.next
# 특정 인덱스에 있는 노드 알아내기
def get_node(self, index):
cnt = 0
node = self.head
while cnt < index:
cnt += 1
node = node.next
return node
#삽입
def add_node(self, index, value):
new_node = Node(value)
if index == 0:
new_node.next = self.head
self.head = new_node
return
node = self.get_node(index-1)
next_node = node.next
node.next = new_node
new_node.next = next_node
#삭제
def delete_node(self, index):
if index == 0:
self.head = self.head.next
return
node = self.get_node(index-1)
node.next = node.next.next
📌 接続リストの例
📚 接続リストLEETCode 206を反転する。Reverse Linked List
from typing import Optional
from structures import ListNode
class Solution:
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
cur, prv = head, None
while cur:
nxt = cur.next
cur.next = prv
prv = cur
cur = nxt
return prv
cur,prvをheadとNoneにそれぞれ指向させ,繰り返し文はcurの次のノードアドレスをnxtに格納し,curの次のアドレスcurを格納する.nextをprvに保存します.では、ノードの次の順序はprvノードとその後に接続されたノードです.curノードアドレスをprvに再保存します(curの次のノードがprvに接続されているため、cur+prvをprvに保存します).Curは、元の接続リストに示されている次のノードnxtのアドレスに移動します.🔍 1回繰り返す
cur : 1->2->3->4->5
prv : None
net : 2->3->4->5
cur.next = prv
(cur : 1->None)
prv,cur = cur,nxt
(prv : 1->None)
(cur : 2->3->4->5)
🔍 2回繰り返す
cur : 2->3->4->5
prv : 1->None
nxt : 3->4->5
cur.next = prv
(cur : 2->1->None)
prv,cur = cur,nxt
(prv : 2->1->None)
(cur : 3->4->5)
その後、繰り返し文が完了すると、input値headの接続リストが逆順序で返されます.
ポスト
半日接続リストの概念を調べてやっと分かった.最初は、入力値を設定している間に接続リスト構造としてどのように作成するかわからず、ノードがすべて出力されている間に、重複文に次のノードアドレスを入力しないと無限ループに陥り、コードの定義方法も分からず、以下のソースの文章を見て少し理解し、問題解決にも成功しました.
head = ListNode(1)
head.next = ListNode(2)
head.next.next = ListNode(3)
head.next.next.next = ListNode(4)
head.next.next.next.next = ListNode(5)
result = solution.reverseList(head)
while result:
print(result.val)
result = result.next
上記の方法で値を入力すればよい.私が普段あまり知らないhashmapやlinkedlistなどには、このような内蔵関数が隠されています.今は資料構造の入門ですが、これから学ぶことが多いと思います.接続リストの概念の開発に伴い、ますます重要になってきたと思います.
ソース:https://velog.io/@kyunghwan1207/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0Python%EC%9C%BC%EB%A1%9C-Stack-Queue-LinkedList-%EA%B5%AC%ED%98%84-bmpk4w1l
https://velog.io/@yeseolee/python-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%97%B0%EA%B2%B0%EB%A6%AC%EC%8A%A4%ED%8A%B8Linked-List-feat.LeetCode
Reference
この問題について(接続リスト), 我々は、より多くの情報をここで見つけました https://velog.io/@jins_dev/연결-리스트テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol