์ฐ๊ฒฐ๋ฆฌ์คํธ(Linked List)
๋ ธ๋(node)
- ๋ฐ์ดํฐ๋ค์ ๊ฐ๊ณ ์๋ ์์๋ค์ด ์ฐธ์กฐ๋ก ์ด์ด์ ธ ์์
- ๋ ธ๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ๋ถ๋ถ๊ณผ ๋ค์ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ์ฐธ์กฐ๋ก ๊ตฌ์ฑ
- ์ด๋ ๊ฒ ๋ฐ์ดํฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ฒฐ(link) ํด๋์๊ธฐ ๋๋ฌธ์ ์ฐ๊ฒฐ๋ฆฌ์คํธ(Linked List) ๋ผ๊ณ ํจ
์ฐ๊ฒฐ๋ฆฌ์คํธ(Linked List)
- ํฌ์ธํฐ๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์๋ฃ ๊ตฌ์กฐ
- ๋ฌผ๋ฆฌ์ ๊ตฌ์กฐ๊ฐ ์์ฐจ์ ์ด์ง ์์
- ํฌ์ธํฐ๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ฏ๋ก ๋ฐ์ดํฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ธ์ ํด ์์ง๋ ์์
- ์ฝ์ ๊ณผ ์ญ์ ๊ฐ ๋น๋ฒํ ๊ฒฝ์ฐ ์ฌ์ฉ
์ฐ๊ฒฐ๋ฆฌ์คํธ(Linked List)์ ์ข ๋ฅ
-
- ๋จ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ(Single Linked List)
- ๋ค์ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ์ฐธ์กฐ ํ๋๋ง ๊ฐ์ง๊ณ ์์
- ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ(Double Linked List)
- ์ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ์ฐธ์กฐ์ ๋ค ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ์ฐธ์กฐ๋ฅผ ๋ชจ๋ ๊ฐ์ง๊ณ ์์
์ฐ๊ฒฐ๋ฆฌ์คํธ์ ์ฝ์ , ์ญ์ , ํ์
- ์ฝ์
์ฐ๊ฒฐ๋ฆฌ์คํธ
- ์๋ก์ด ๋ ธ๋ ์์ฑ
- ์ ๋ ธ๋์ ๋งํฌ๋ฅผ ์์ฑ๋ ๋ ธ๋๋ก ํ๊ณ , ์์ฑ๋ ๋ ธ๋์ ๋งํฌ๋ฅผ ๋ท ๋ ธ๋๋ก ํ๋ค
๋ฐฐ์ด
- ๋ฐฐ์ด์ ๋ง์ง๋ง์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํ๋ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ O(n)์ ์ฑ๋ฅ์ ๊ฐ์ง
- ๋๋ฆฐ ์ฝ์ /์ญ์
- ์ญ์
์ฐ๊ฒฐ๋ฆฌ์คํธ
- ์ญ์ ํ ๋ ธ๋ ์ ๋ ธ๋์ ๋งํฌ๋ฅผ ๋ท ๋ ธ๋๋ก ์ฐ๊ฒฐ์ํจ๋ค.
๋ฐฐ์ด
- ๋ฐฐ์ด์ ๋ง์ง๋ง์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํ๋ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ O(n)์ ์ฑ๋ฅ์ ๊ฐ์ง
- ๋๋ฆฐ ์ฝ์ /์ญ์
- ํ์
์ฐ๊ฒฐ๋ฆฌ์คํธ
- ๋ฆฌ์คํธ ์ฒ์๋ถํฐ ๋๊น์ง ํ๋์ฉ ๋ฐฉ๋ฌธํ๋ฉด์ ํด๋น ์์๋ฅผ ๋น๊ตํ์ฌ ์ฐพ์
๋ฐฐ์ด
- ๋จ ํ๋ฒ์ ์ฐ์ฐ์ผ๋ก ํด๋น ์ธ๋ฑ์ค์ ๋ฐ์ดํฐ์ ์ ๊ทผ ๊ฐ๋ฅ
๋๋ฏธ ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ(dummy double linked list)
- ๋ณดํต ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ผ ํ๋ฉด dummy double linked list๋ฅผ ์๋ฏธ
- ๋๋ฏธ ๋
ธ๋๋ฅผ ์ฌ์ฉ
- ๋๋ฏธ๋ ธ๋๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ head ํน์ tail ์ ๋๋ฏธ๋ ธ๋๋ฅผ ๊ธฐ์ค์ผ๋ก โ ๊ทธ ๋ค(์)๋ก ๋ช ๋ฒ ๊ฐ์ ์ฝ์ , ๊ทธ ๋ค(์)๋ก ๋ช ๋ฒ ๊ฐ์ ์ญ์ โ๋ผ๋ ํ๋์ ๋ก์ง์ผ๋ก ๋์์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ผ๋ฐํ ์ํฌ ์ ์์
-
head, tail์ด ๊ฐ๋ฆฌํค๋ ๋๋ฏธ๋ ธ๋์๋ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋์ด์์ง ์์
๋ ธ๋ ๊ตฌํ
- data ์ ์ฐธ์กฐํ prev / next ์์ฑ
class Node:
def __init__(self, data=None):
self.__data=data
self.__prev=None
self.__next=None
# ์๋ฉธ์ : ๊ฐ์ฒด๊ฐ ์ฌ๋ผ์ง๊ธฐ ์ ๋ฐ๋์ ํธ์ถ๋ฉ๋๋ค.
# ์ญ์ ์ฐ์ฐ ๋ ์ญ์ ๋๋ ๊ฒ์ ํ์ธํ๊ธฐ ์ํด
# ์์ฑํ์์ต๋๋ค.
def __del__(self):
print("data of {} is deleted".format(self.data))
@property
def data(self):
return self.__data
@data.setter
def data(self, data):
self.__data=data
@property
def prev(self):
return self.__prev
@prev.setter
def prev(self, p):
self.__prev=p
@property
def next(self):
return self.__next
@next.setter
def next(self, n):
self.__next=n
class DoubleLinkedList:
def __init__(self):
#๋๋ฏธ๋
ธ๋
self.head=Node()
self.tail=Node()
#์ด๊ธฐํ
#head, tail ์ฐ๊ฒฐ
self.head.next=self.tail
self.tail.prev=self.head
self.d_size=0
def empty(self):
if self.d_size==0:
return True
else:
return False
def size(self):
return self.d_size
def add_first(self, data):
#์๋ก์ด ๋
ธ๋ ๋ง๋ฆ
new_node=Node(data)
#์๋ก์ด ๋
ธ๋๋ฅผ ๋๋ฏธ๋
ธ๋ ๋ค์์ ๊ฐ๋ฆฌํค๋๋ก ํจ
new_node.next=self.head.next
#prev๋ ๋ฆฌ์คํธ์ ๋งจ ์ ๋๋ฏธ๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํจ
new_node.prev=self.head
#์ฒซ๋ฒ์งธ ๋ฐ์ดํฐ๋
ธ๋์ prev๊ฐ ์๋ก์ด ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋๋ก
self.head.next.prev=new_node
#๋๋ฏธ๋
ธ๋์ next๋ ์๋ก์ด ๋
ธ๋ ๊ฐ๋ฆฌํค๋๋ก(์๋ก์ด ๋
ธ๋ ์ฝ์
)
self.head.next=new_node
# d_size ์ฆ๊ฐ์ํด
self.d_size+=1
def add_last(self, data):
new_node=Node(data)
new_node.prev=self.tail.prev
new_node.next=self.tail
self.tail.prev.next=new_node
self.tail.prev=new_node
self.d_size+=1
def insert_after(self, data, node):
new_node=Node(data)
new_node.next=node.next
new_node.prev=node
node.next.prev=new_node
node.next=new_node
self.d_size+=1
def insert_before(self, data, node):
new_node=Node(data)
new_node.prev=node.prev
new_node.next=node
node.prev.next=new_node
node.prev=new_node
self.d_size+=1
def search_forward(self, target):
cur=self.head.next
while cur is not self.tail:
if cur.data==target:
return cur
cur=cur.next
return None
def search_backward(self, target):
cur=self.tail.prev
while cur is not self.head:
if cur.data==target:
return cur
cur=cur.prev
return None
def delete_first(self):
if self.empty():
return
self.head.next=self.head.next.next
self.head.next.prev=self.head
self.d_size-=1
def delete_last(self):
if self.empty():
return
self.tail.prev=self.tail.prev.prev
self.tail.prev.next=self.tail
self.d_size-=1
def delete_node(self, node):
node.prev.next=node.next
node.next.prev=node.prev
self.d_size-=1