[Data Structure]Linked List

Error Coderยท2022๋…„ 10์›” 19์ผ
0

๐Ÿ’ก ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ(Linked List)

๐Ÿ“Œ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ž€?

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋Š” ๋‹ค๋ฅธ ์ถ”์ƒ ์ž๋ฃŒํ˜•(Abstract Data Type)์„ ๊ตฌํ˜„ํ•  ๋•Œ ๊ธฐ๋ฐ˜์ด ๋˜๋Š” ๊ธฐ์ดˆ ์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

๊ฐ ๋…ธ๋“œ๊ฐ€ ๋ฐ์ดํ„ฐ์™€ ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ํ•œ ์ค„๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค. ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ ๋‘๋“œ๋Ÿฌ์ง€๋Š” ํŠน์ง•๋“ค์„ ๋ฐฐ์—ด๊ณผ ๋น„๊ตํ•ด์„œ ๋ณด๋ฉด ์ข‹๋‹ค.

์ถœ์ฒ˜: <ํŒŒ์ด์ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ธํ„ฐ๋ทฐ> p.199, ์ฑ…๋งŒ, 2020

๐Ÿ“š ๋ฐฐ์—ด VS ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ

  • ๋ฐฐ์—ด์€ ๋ฌผ๋ฆฌ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ย ์—ฐ์†์ ์ด๊ณ , ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋Š” ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ย ์—ฐ์†์ ์ด์ง€ ์•Š๊ณ  ๋žœ๋ค์ด๋‹ค.
  • ๋ฐฐ์—ด์€ย ์‚ฝ์ž…/์‚ญ์ œ๊ฐ€ย O(n)์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ์ง€๋งŒ, ๋™์ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋Š”ย ์‚ฝ์ž…/์‚ญ์ œ์—ย O(1)์ด ๊ฑธ๋ฆฐ๋‹ค.
  • ๋ฐฐ์—ด์€ ๊ฐ ์›์†Œ์— ์ธ๋ฑ์Šค๋กœย O(1)์˜ ์‹œ๊ฐ„์œผ๋กœ ์†์‰ฝ๊ฒŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋Š”ย O(n)์˜ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค. (๋ฐฐ์—ด๊ณผ ๋‹ค๋ฅด๊ฒŒย ์—ฐ๊ฒฐ๋œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ์„œ ํƒ์ƒ‰ํ•ด์•ผ ํ•œ๋‹ค.)

๐Ÿ“Œ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ์ข…๋ฅ˜

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์—๋Š” ์‹ฑ๊ธ€ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ(Singly Linked List), ๋”๋ธ” ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ(Doubly Linked List), ์›ํ˜• ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ(Circular Linked List)๊ฐ€ ์žˆ๋‹ค.๊ทธ ์ค‘ ์ด ๊ธ€์—์„œ๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์‹ฑ๊ธ€ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•ด ๋‹ค๋ฃฐ ์˜ˆ์ •์ด๋‹ค.

๐Ÿ“Œ ์‹ฑ๊ธ€ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ(Singly Linked List)

์ž๋ฃŒ๊ตฌ์กฐ์— ๋Œ€ํ•œ ๊ตฌํ˜„๋ณด๋‹ค๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅํ•œ ๋…ธ๋“œ๋งŒ ์ •์˜ํ•ด์„œ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ ๋™์ž‘์„ ์‚ดํŽด ๋ณด๋ คํ•œ๋‹ค.

์ž์„ธํ•œ ๊ตฌํ˜„์€ย ํŒŒ์ด์ฌ์œผ๋กœ ๊ตฌํ˜„ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ - ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธย ํ˜น์€ย ํŒŒ์ด์ฌ ์ž๋ฃŒ๊ตฌ์กฐ 8-1์žฅ. ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธย ๊ธ€์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๐Ÿ“š ๋…ธ๋“œ ์ •์˜

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

๐Ÿ“š ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ

๋ณดํ†ต ํ—ค๋”๋ฅผ ์„ ์–ธํ•˜์—ฌ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ ,ํ—ค๋”๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ  ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.๋”ฐ๋ผ์„œ,ย head๋ฅผ ์ง์ ‘ ์ด๋™์‹œํ‚ค์ง€ ์•Š๊ณ ,ย node=head๋กœย head์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.(์›๋ž˜ ํ—ค๋”๋Š” data๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์ง€ ์•Š์œผ๋ฉฐ, ํ—ค๋”์˜ ๋‹ค์Œ ๋…ธ๋“œ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๋‚˜ ํŽธ์˜์ƒ ์ž„์˜์˜ ๊ฐ’์„ ๋„ฃ๊ณ  ๋‹ค์Œ ๋…ธ๋“œ๋ถ€ํ„ฐ ์‚ฌ์šฉํ•ด๋„ ๋˜๊ณ ,ย head๋…ธ๋“œ ๋ถ€ํ„ฐ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค.)

head = ListNode(0)

๐Ÿ“š ๋…ธ๋“œ ์ถ”๊ฐ€(์‚ฝ์ž…)

#add new_node
curr_node = head

new_node = ListNode(1)
curr_node.next = new_node
curr_node=curr_node.next

curr_node.next = ListNode(2)
curr_node=curr_node.next

curr_node.next = ListNode(3)
curr_node=curr_node.next

curr_node.next = ListNode(4)
curr_node=curr_node.next

๐Ÿ“š ์ „์ฒด ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ์ถœ๋ ฅ (ํƒ์ƒ‰)

#print all node
node=head
while node:
    print(node.val)
    node=node.next
''' ์ถœ๋ ฅ๊ฒฐ๊ณผ : 0,1,2,3,4 '''

๐Ÿ“š ๋…ธ๋“œ ํƒ์ƒ‰ํ•˜์—ฌ ์‚ญ์ œ

#delete node by value
node=head
while node.next:
    if node.next.val==2:
        next_node=node.next.next
        node.next=next_node
        break
    node=node.next

node=head
while node:
    print(node.val)
    node=node.next
''' ์ถœ๋ ฅ๊ฒฐ๊ณผ : 0,1,3,4 '''
profile
๊ฐœ๋ฐœ์ž ์ง€๋ง์ƒ

0๊ฐœ์˜ ๋Œ“๊ธ€