๋ ธ๋์ ํฌ์ธํฐ๋ก ์ด๋ค์ง ์๋ฃ๊ตฌ์กฐ๋ก Array์ ๊ฐ์ด ์ผ๋ จ์ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ์ ์๋ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
Array๋ ๋ฌด์์ด ๋ค๋ฅธ๊ฐ?
Array
์ ๋นํด ์ฝ์
, ์ญ์ ๋ฑ ์์ ์ ์ฉ์ดํ๋ค.
LinkedList
์์ ์์ ์ ๋จ์ง ์ฐ๊ฒฐ์ ๋๊ณ ๋ ์ฐ๊ฒฐํ๋ ๊ฒ์ด๋ค.
Array
๋ ์ฝ์
, ์ญ์ ์ ์ต์
์ ๊ฒฝ์ฐ Array
์ ํฌ๊ธฐ๋งํผ์ ์ฐ์ฐํ์๋ฅผ ๊ฐ๋๋ค (= O(N))
but, Array
์ ๋นํด ์กฐํ์ฑ๋ฅ์ด ๋จ์ด์ง๋ค.
์กฐํํ๊ณ ์ ํ๋ ๋
ธ๋๊ฐ ๊ฐ์ฅ ๋์ ์๋ค๋ฉด O(N)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ๋๋ค. ํฌ์ธํฐ๋ฅผ ํ๊ณ ์ฌ๋ผ๊ฐ๋ฉฐ ์ญ~์ฑ ์ํํด์ผ ํจ!
์กฐํ๊ฐ ์์ฃผ ๋ฐ์ํ๋ค๋ฉด ? Array ๐
์์ ์ด ์์ฃผ ๋ฐ์ํ๋ค๋ฉด ? LinkedList ๐
LinkedList
๋ ๊ฐ์ ๋ด๋ node
์ ๋ค์ node๋ฅผ ๊ฐ๋ฆฌํฌ pointer
๊ฐ ์์ด์ผ ํ๋ค. ์ด๋ฐ ๊ตฌ์กฐ๋ ์๋์ ๊ฐ์ด ๊ตฌํ ๊ฐ๋ฅํ๋ค.
class Node:
def __init__(self, data):
self.data = data
self.next = None
์ด์ Node
ํด๋์ค๋ฅผ ์ด์ฉํด์ LinkedList๋ฅผ ๊ตฌํํ๋ค.
List
์ ์ฃผ์ ์ฐ์ฐ์ธ ์กฐํ, ์ฝ์
, ์ญ์ ๋ฅผ ๊ตฌํํ๋ค.
LinkedList
๋ ๋ฐ๋์ ๋ฐ๋์ ๋ฐ๋์ Head
๋
ธ๋๋ฅผ ๊ฐ์ ธ์ผ ํ๋ค. ๊ทธ๋ฌ๋ LinkedList
์ ์์ฑ์์์ ๋ฌด์กฐ๊ฑด Head
๋
ธ๋๊ฐ ์์ฑ๋๋๋ก ํ๋ค.
class LinkedList:
def __init__(self, data):
self.head = Node(data)
...
# ์์ฑ
linked_list = LinkedList(1)
LinkedList
๋ฅผ ์กฐ์ํ๋ ๊ฒ์ ์์ด์ ๋ฝ์ธํธ๋ LinkedList
์ํ์ head
๋
ธ๋๋ฅผ ์ง์ ์์ง์ด์ง ์๊ณ ๋ณต์ฌํด์ ์ฌ์ฉํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค. (head๋ ์์ง์ด๋ฉด ์๋จ!)
cur = self.head
index
๊น์ง next๋ฅผ ๋ฐ๋ณตํ๋ฉฐ ํฌ์ธํฐ๋ฅผ ์ฎ๊ธฐ๊ณ index๋ฒ ์งธ์ ๋๋ฌํ์ ๋ ๋ฃจํ๋ฅผ ๋์์ ํด๋น ๋
ธ๋๋ฅผ ๋ฐํํ๋ค.
def get(self, index):
cur = self.head
cnt = 0
while cnt < index:
cur = cur.next
cnt += 1
return cur
append
)head ๋
ธ๋๋ถํฐ next๋ฅผ ์ด์ฉํด์ ๋ค์ ๋
ธ๋๋ก ์ด๋ํ๋ฉด์ ๋ค์ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค์ง ์์ ๋๊น์ง ์ด๋ํ๋ค (next
)
๋ค์ ๋
ธ๋๊ฐ None
์ด๋ผ๋ฉด While
๋ฌธ์ ํ์ถํ๊ณ ํด๋น node์ next๋ก ๋
ธ๋๋ฅผ ์์ฑํ๋ค.
def append(self, data):
if self.head is None: # ํค๋๋
ธ๋ ์๋ ๊ฒฝ์ฐ ์ถ๊ฐ๋๋ ๋
ธ๋๊ฐ ํค๋๋
ธ๋๊ฐ ๋๋๋ก ์ฒ๋ฆฌ
self.head = Node(data)
return
cur = self.head
while cur.next is not None:
cur = cur.next
cur.next = Node(data)
n
๋ฒ์งธ์ ์ฝ์
ํ๊ณ ์ถ๋ค๋ฉด n-1
๋ฒ์งธ ๋
ธ๋์ next๊ฐ ์ฝ์
ํ๊ณ ์ ํ๋ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋ ์ฝ์
๋๋ ๋
ธ๋๋ ์๋ n
๋ฒ์งธ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํ๋ฉด ๋๋ค.
์ค์ํ ๊ฒ์ ์๋์ n-1
๋ฒ์งธ ๋
ธ๋์ n
๋ฒ์งธ ๋
ธ๋์ ์ฐ๊ฒฐ์ ๋๊ธฐ ์ด์ ์ n
๋ฒ์งธ ๋
ธ๋๋ฅผ ๋ฐ๋์ ์ ์ฅํด๋ฌ์ผ ํ๋ค. ์๋๋ฉด ๋ค์ ์ฐธ์กฐํ ์ ์๋ค.
[ ์ด๋ถ๋ถ !! ]
next_node = curr_node.next
def insert(self, index, value):
if index == 0:
next_node = self.head
self.head = Node(value)
self.head.next = next_node
return
# -1 ๋ฒ์งธ๋ฅผ ์ฐพ๋๋ค๋ฉด ์ธ์ ๋ 0์ผ ๋ ์์ธ์ํฉ์ ์๊ฐนํด์ผ ํ๋ค.
curr_node = self.get(index - 1)
new_node = Node(value)
next_node = curr_node.next
curr_node.next = new_node
new_node.next = next_node
์ ์ผ ๊ฐ๋จํ๋ค ๐
def delete(self, index):
if index == 0:
self.head = self.head.next
return
prev_node = self.get(index - 1)
prev_node.next = prev_node.next.next
์๊ณ ๋ฆฌ์ฆ ์ฃผ๊ฐ Start !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!