ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋ฐ˜์‘ํ˜•

์ถ”์ƒ์  ์ž๋ฃŒ๊ตฌ์กฐ (Abstract Data Structures)

์ž๋ฃŒ๊ตฌ์กฐ์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ์ˆจ๊ฒจ๋‘๊ณ  ๋ฐ–์—์„œ ๋ณด์ด๋Š” ๊ฒƒ๋“ค (๋‘ ๊ฐ€์ง€)์„ ๋งํ•จ

  • Data : ์ •์ˆ˜, ๋ฌธ์ž์—ด, ๋ ˆ์ฝ”๋“œ...
  • A set of operations : ์‚ฝ์ž…, ์‚ญ์ œ, ์ˆœํšŒ... ์ •๋ ฌ, ํƒ์ƒ‰...

 

 

 

 


๊ธฐ๋ณธ์  ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ

์•ž์— ์žˆ๋Š” ๋†ˆ์ด ๋’ค์— ์žˆ๋Š” ๋†ˆ์„ ๊ฐ€๋ฅดํ‚ค๋Š” ํ˜•์‹์œผ๋กœ ๋Š˜์–ด๋†“์€ ๊ฒƒ์ด ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ผ๊ณ  ํ•œ๋‹ค.

๋ฆฌ์ŠคํŠธ์˜ ๋งจ ์ฒ˜์Œ ๋…ธ๋“œ Head

๋ฆฌ์ŠคํŠธ์˜ ๋งจ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ Tail

๋ฆฌ์ŠคํŠธ์— ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ Tail์„ ์‚ฌ์šฉํ•œ๋‹ค.

๋…ธ๋“œ๊ฐ€ ๋ช‡๊ฐœ ์žˆ๋Š”์ง€๋„ ๊ธฐ๋กํ•ด๋‘๋Š” ๊ฒƒ์ด ์ข‹๋‹ค of nodes : 3

 

๋…ธ๋“œ๋Š” Data์™€ Link(Next)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

๋…ธ๋“œ ๋‚ด์˜ ๋ฐ์ดํ„ฐ๋Š” ๋‹ค๋ฅธ ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค (๋ฌธ์ž์—ด, ๋ ˆ์ฝ”๋“œ, ๋˜ ๋‹ค๋ฅธ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๋“ฑ)

 

 

 

 


์ž๋ฃŒ๊ตฌ์กฐ ์ •์˜

# Node ํด๋ž˜์Šค

# Node ํด๋ž˜์Šค
class Node:
    # ์ƒ์„ฑ์ž
    def __init__(self, item):
        self.data = item
        self.next = None

 

 

# LinkedList ํด๋ž˜์Šค

# LinkedList ํด๋ž˜์Šค
class LinkedList:
    def __init__(self):
        self.nodeCount = 0
        self.head = None
        self.tail = None

 

 

 

 


์—ฐ์‚ฐ์ •์˜

  1. ํŠน์ • ์›์†Œ(k๋ฒˆ์งธ) ์ฐธ์กฐ
  2. ๋ฆฌ์ŠคํŠธ ์ˆœํšŒ
  3. ๊ธธ์ด ์–ป์–ด๋‚ด๊ธฐ
  4. ์›์†Œ ์‚ฝ์ž…
  5. ์›์†Œ ์‚ญ์ œ
  6. ๋‘ ๋ฆฌ์ŠคํŠธ ํ•ฉ์น˜๊ธฐ

 

 

1. ํŠน์ • ์›์†Œ ์ฐธ์กฐ getAt

๋…ธ๋“œ๋ฅผ 0๋ถ€ํ„ฐ ์ฐธ์กฐํ•˜์ง€ ์•Š๊ณ  1๋ถ€ํ„ฐ ์ฐธ์กฐํ•˜๋Š” ์ด์œ ๋Š” ๋‚˜์ค‘์— 0์„ ๋‹ค๋ฅธ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค.

    # 1. ํŠน์ • ์›์†Œ ์ฐธ์กฐ
    def getAt(self, pos):
        # ํŠน์ •์œ„์น˜๊ฐ€ 0๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๋…ธ๋“œ์˜ ๊ธธ์ด๋ณด๋‹ค ํฌ๋ฉด None์„ ๋ฐ˜ํ™˜
        if pos <= 0 or pos > self.nodeCount:
            return None
        
        i = 1
        curr = self.head # ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ๋ฒˆ์งธ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฅดํ‚ด
        
        # i๊ฐ€ pos๋ณด๋‹ค ์ž‘์€ ๋™์•ˆ์— i๋ฅผ ํ•˜๋‚˜์”ฉ ์ฆ๊ฐ€์‹œํ‚ค๋ฉด์„œ curr๋ฅผ curr์˜ next๋ฅผ ๊ฐ€๋ฅดํ‚ค๊ฒŒ ํ•œ๋‹ค
        # ์ฆ‰ pos-1๋ฒˆ ๋งŒํผ ์ „์ง„ํ•˜๋ฉด ๊ทธ๋•Œ curr๊ฐ€ ๊ฐ€๋ฅดํ‚ค๋Š” ๊ฒƒ์ด ๋‚ด๊ฐ€ ๋ฆฌํ„ดํ•˜๋ ค๋Š” pos๋ฒˆ์งธ ๋…ธ๋“œ๊ฐ€ ๋œ๋‹ค
        while i < pos: 
            curr = curr.next
            i += 1
        
        return curr

 

 

 

๋ฐฐ์—ด๊ณผ ๋น„๊ตํ•œ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ

์„ ํ˜• ๋ฐฐ์—ด์€ "๋ฒˆํ˜ธ๊ฐ€ ๋ถ™์—ฌ์ง„ ์นธ์— ์›์†Œ๋“ค์„ ์ฑ„์›Œ๋„ฃ๋Š”" ๋ฐฉ์‹์ด๋ผ๊ณ  ํ•œ๋‹ค๋ฉด, ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” "๊ฐ ์›์†Œ๋“ค์„ ์ค„์ค„์ด ์—ฎ์–ด์„œ" ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

์„ ํ˜• ๋ฐฐ์—ด์— ๋น„ํ•ด ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๊ฐ€์ง€๋Š” ์ด์ ์€?

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ๋Š” ์›์†Œ๋“ค์ด ๋งํฌ(link)๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ณ ๋ฆฌ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ๊ฐ€์šด๋ฐ์—์„œ ๋Š์–ด ์›์†Œ ํ•˜๋‚˜๋ฅผ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜, ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ์ด ์„ ํ˜• ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ๋ณด๋‹ค ๋น ๋ฅธ ์‹œ๊ฐ„๋‚ด์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์›์†Œ์˜ ์‚ฝ์ž…/์‚ญ์ œ๊ฐ€ ๋นˆ๋ฒˆํžˆ ์ผ์–ด๋‚˜๋Š” ์‘์šฉ์—์„œ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋งŽ์ด ์ด์šฉ๋œ๋‹ค. ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์„ ๊ตฌ์„ฑํ•˜๋Š” ์ค‘์š”ํ•œ ์š”์†Œ์ธ ์šด์˜์ฒด์ œ(operating system)์˜ ๋‚ด๋ถ€์—์„œ๋„ ์ด๋Ÿฌํ•œ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์ด์šฉ๋˜๊ณ  ์žˆ๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด ๋‹จ์ ์€?

์„ ํ˜• ๋ฐฐ์—ด์— ๋น„ํ•ด์„œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐํ‘œํ˜„์— ์†Œ์š”๋˜๋Š” ์ €์žฅ ๊ณต๊ฐ„(๋ฉ”๋ชจ๋ฆฌ) ์†Œ์š”๊ฐ€ ํฌ๋‹ค. ๋˜ "k๋ฒˆ์งธ ์›์†Œ"๋ฅผ ์ฐพ์•„๊ฐ€๋Š”๋ฐ ์„ ํ˜• ๋ฐฐ์—ด๋ณด๋‹ค ์˜ค๋žœ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค. (์•ž์—์„œ๋ถ€ํ„ฐ ํŠน์ •์›์†Œ๊นŒ์ง€ ํ•˜๋‚˜์”ฉ ๋งํฌ๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ฉฐ ์ฐพ์•„์•ผ ํ•˜๋‹ˆ๊นŒ)

 

 

 

2. ๋ฆฌ์ŠคํŠธ ์ˆœํšŒ

    # 2. ๋ฆฌ์ŠคํŠธ ์ˆœํšŒ
    def traverse(self):
        result = []
        curr = self.head
        while curr is not None:
            result.append(curr.data)
            curr = curr.next
        return result

 

 

 

3. ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์—ฐ์‚ฐ - ์›์†Œ์˜ ์‚ฝ์ž…

์›์†Œ๊ฐ€ ์‚ฝ์ž…๋  ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด 1 <= pos <= nodeCount + 1 ์ด ๋ฒ”์œ„ ์•ˆ์—๋งŒ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค.

newNode๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ์„ฑ๊ณต/์‹คํŒจ์— ๋”ฐ๋ผ True/False๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

๋จผ์ € pos-1์„ ์ฐพ์•„๋‚ธ ํ›„ prev์— ์ €์žฅ

์ฒซ๋ฒˆ์งธ newNode์˜ ๋’ท์ชฝ ๋งํฌ๋ฅผ ์กฐ์ •

๋‘๋ฒˆ์งธ : ์•ž์„  ๋…ธ๋“œ pos-1๋ฒˆ์งธ ๋…ธ๋“œ๊ฐ€ new๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฅดํ‚ค๋„๋ก ํ•˜๊ฒŒํ•œ๋‹ค

๋งˆ์ง€๋ง‰์œผ๋กœ ๋…ธ๋“œ์นด์šดํŠธ๋ฅผ 1๋งŒํผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

์ฒซ๋ฒˆ์งธ์™€ ๋‘๋ฒˆ์งธ์˜ ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ๋ฉด ์•ˆ๋œ๋‹ค.

 

์ฝ”๋“œ ๊ตฌํ˜„์‹œ ์ฃผ์˜์‚ฌํ•ญ

1. ์‚ฝ์ž…ํ•˜๋ ค๋Š” ์œ„์น˜๊ฐ€ ๋ฆฌ์ŠคํŠธ ๋งจ ์•ž์ผ ๋•Œ

  • prev ์—†์Œ
  • Head ์กฐ์ • ํ•„์š”

2. ์‚ฝ์ž…ํ•˜๋ ค๋Š” ์œ„์น˜๊ฐ€ ๋ฆฌ์ŠคํŠธ ๋งจ ๋์ผ ๋•Œ

  • Tail ์กฐ์ • ํ•„์š”

3. ๋นˆ ๋ฆฌ์ŠคํŠธ์— ์‚ฝ์ผ ํ•  ๋•Œ

  • ์ด ๋‘ ์กฐ๊ฑด์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋จ

 

# ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ์—ฐ์‚ฐ - ์›์†Œ์˜ ์‚ฝ์ž…
    def insertAt(self, pos, newNode):
        # pos์˜ ์œ„์น˜๊ฐ€ ์œ ํšจํ•œ์ง€ ํ™•์ธ
        if pos < 1 or pos > self.nodeCount + 1 :
            # pos์œ„์น˜๊ฐ€ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„ ๋ฐ–์— ์žˆ์„ ๋•Œ False ๋ฐ˜ํ™˜
            return False
        
        # ๋…ธ๋“œ๋ฅผ ๋งจ ์ฒ˜์Œ ์œ„์น˜์— ์‚ฝ์ผํ•  ๋•Œ(prev์—†์Œ)
        if pos == 1: # (๋นˆ ๋…ธ๋“œ์˜ ์‚ฝ์ž…ํ•  ์กฐ๊ฑด์— ๊ฑธ๋ฆผ)
            newNode.next = self.head # ์ƒˆ๋กœ์šด ๋…ธ๋“œ์˜ next๋Š” head
            self.head = newNode # ํ—ค๋“œ๊ฐ€ ์ƒˆ๋กœ์šด๋…ธ๋“œ๊ฐ€ ๋œ๋‹ค
        
        # ์‚ฝ์ž…ํ•˜๋ ค๋Š” ์œ„์น˜๊ฐ€ ์ฒ˜์Œ์ด ์•„๋‹ ๋•Œ
        else: 
            if pos == self.nodeCount + 1: # ์‚ฝ์ž…ํ•˜๋ ค๋Š” ์œ„์น˜๊ฐ€ ๋งจ๋์ผ ๋•Œ
                prev = self.tail # prev == tail๊ณผ ๊ฐ™์Œ(์•ž์—์„œ ๋ถ€ํ„ฐ ์ฐพ์„ ํ•„์š” ์—†์Œ)
            else: # ์‚ฝ์ž…ํ•˜๋ ค๋Š” ์œ„์น˜๊ฐ€ ์ฒ˜์Œ๋„ ์•„๋‹ˆ๊ณ  ๋งจ๋๋„ ์•„๋‹ ๋•Œ
                prev = self.getAt(pos-1) # ๋ผ์›Œ๋„ฃ์œผ๋ ค๋Š” ์ง์ „์˜ ์œ„์น˜๋ฅผ ์–ป์–ด๋‚ธ๋‹ค
            
            newNode.next = prev.next # ์ƒˆ๋กœ์šด ๋…ธ๋“œ๊ฐ€ prev.next๋ฅผ ๊ฐ€๋ฅดํ‚ค๋„๋กํ•œ๋‹ค.
            prev.next = newNode # prev.next๋ฅผ newNode๋กœ ํ•œ๋‹ค
        
        # ๋งจ ๋งˆ์ง€๋ง‰ ์œ„์น˜์— ์‚ฝ์ž… ํ•  ๋•Œ (๋นˆ ๋…ธ๋“œ์˜ ์‚ฝ์ž…ํ•  ์กฐ๊ฑด์— ๊ฑธ๋ฆผ)
        if pos == self.nodeCount + 1:
            self.tail = newNode # Tail์„ ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋กœ ๋ณ€๊ฒฝ
            
        # ๋งˆ์ง€๋ง‰์œผ๋กœ ๋…ธ๋“œ์˜ ๊ฐฏ์ˆ˜ ์ฆ๊ฐ€
        self.nodeCount += 1
        return True

 

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์›์†Œ ์‚ฝ์ž…์˜ ๋ณต์žก๋„

  • ๋งจ ์•ž์— ์‚ฝ์ž…ํ•˜๋Š” ๊ฒฝ์šฐ O(1)
  • ์ค‘๊ฐ„์— ์‚ฝ์ž…ํ•˜๋Š” ๊ฒฝ์šฐ O(n)
  • ๋งจ ๋์— ์‚ฝ์ž…ํ•˜๋Š” ๊ฒฝ์šฐ O(1) -> tail์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—

 

 

 

 

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์—ฐ์‚ฐ - ์›์†Œ์˜ ์‚ญ์ œ

def pop(self, pos)

pos์˜ ์œ„์น˜๊ฐ€ 1<= pos <= nodeCount ์•ˆ์— ์œ„์น˜ํ•ด์•ผํ•œ๋‹ค.

๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๊ทธ ๋…ธ๋“œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฆฌํ„ด

pos๋ฅผ curr์— ๋‹ด๋Š”๋‹ค

prev.next์— curr.next๋ฅผ ๋‹ด๋Š”๋‹ค

curr์˜ ๋ฐ์ดํ„ฐ๋ฅผ r์— ์ €์žฅํ•˜๊ณ  ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋ฅผ ํ•˜๋‚˜ ์ค„์—ฌ์ค€๋‹ค.

 

์ฝ”๋“œ ๊ตฌํ˜„ ์ฃผ์˜์‚ฌํ•ญ

1. ์‚ญ์ œํ•˜๋ ค๋Š” node๊ฐ€ ๋งจ ์•ž์˜ ๊ฒƒ์ผ ๋•Œ

  • prev๊ฐ€ ์—†์Œ
  • Head ์กฐ์ • ํ•„์š”

2. ๋ฆฌ์ŠคํŠธ์˜ ๋งจ ๋์˜ node ๋ฅผ ์‚ญ์ œํ•  ๋•Œ

  • Tail ์กฐ์ • ํ•„์š”

3. ์œ ์ผํ•œ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•  ๋•Œ

  • ์ด ๋‘ ์กฐ๊ฑด์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋˜๋Š”๊ฐ€?

 

 

์‚ญ์ œํ•˜๋ ค๋Š” node๊ฐ€ ๋งˆ์ง€๋ง‰ node์ผ ๋•Œ, ์ฆ‰ pos == nodeCount์ธ ๊ฒฝ์šฐ?

์‚ฝ์ž…ํ•˜๋Š” ๊ฒฝ์šฐ์ฒ˜๋Ÿผ tail๋กœ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋‹ค. prev๋ฅผ ์ฐพ์„ ๋ฐฉ๋ฒ•์ด ์—†์œผ๋ฏ€๋กœ ์•ž์—์„œ๋ถ€ํ„ฐ ์ฐพ์•„์™€์•ผํ•œ๋‹ค.

 

    # 4. ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ์—ฐ์‚ฐ - ์›์†Œ์˜ ์‚ญ์ œ
    def popAt(self, pos):
        # pop ๊ฐ’์ด ์œ ํšจํ•œ์ง€ ํ™•์ธ ์ ๋‹นํ•œ ๊ฐ’์ด ์•„๋‹ ๊ฒฝ์šฐ ์—๋Ÿฌ๋ฐœ์ƒ
        if pos < 1 or pos > self.nodeCount:
            raise IndexError
            
        # ๋งจ ์•ž์˜ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ
        if pos == 1:
            curr = self.head
            self.head = self.getAt(pos+1)
            
            # ์œ ์ผํ•œ ๋…ธ๋“œ์ธ ๊ฒฝ์šฐ
            if self.nodeCount == 1:
                self.tail = None
                self.head = None
        
        # ๋งจ ์•ž์˜ ๋…ธ๋“œ๊ฐ€ ์•„๋‹ ๋•Œ
        else:
            prev = self.getAt(pos-1)
            curr = self.getAt(pos)
            prev.next = curr.next
            
            # ๋งจ ๋ ๋…ธ๋“œ์ผ ๋•Œ
            if pos == self.nodeCount:
                self.tail = prev
                
        r = curr.data
        self.nodeCount -= 1
        
        return r

 

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์›์†Œ ์‚ญ์ œ์˜ ๋ณต์žก๋„

  • ๋งจ ์•ž์—์„œ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ O(1)
  • ์ค‘๊ฐ„์—์„œ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ O(n)
  • ๋งจ ๋์—์„œ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ O(n)

 

 

 

 

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์—ฐ์‚ฐ - ๋‘ ๋ฆฌ์ŠคํŠธ์˜ ์—ฐ๊ฒฐ

def concat(self, L)

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ self ์˜ ๋’ค์— ๋˜ ๋‹ค๋ฅธ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์ธ L ์„ ์ด์–ด๋ถ™์ž„

    # 5. ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์—ฐ์‚ฐ - ๋‘ ๋ฆฌ์ŠคํŠธ์˜ ์—ฐ๊ฒฐ
    def concat(self, L):
        # ์›๋ž˜ ๋ฆฌ์ŠคํŠธ์˜ ๋งจ ๋์ด ์ด์–ด๋ถ™์ด๋ ค๋Š” ๋ฆฌ์ŠคํŠธ์˜ ์ฒ˜์Œ์œผ๋กœ
        self.tail.next = L.head
        # ๋ฆฌ์ŠคํŠธ L์ด ๋น„์–ด์žˆ์„ ๊ฒฝ์šฐ
        if L.tail:
            self.tail = L.tail
        self.nodeCount += L.nodeCount

 

 

 

 

 

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๊ฐ€ ํž˜์„ ๋ฐœํœ˜ํ•  ๋•Œ

์‚ฝ์ž…๊ณผ ์‚ญ์ œ๊ฐ€ ์œ ์—ฐํ•˜๋‹ค๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํฐ ์žฅ์ 

๊ทธ๋Ÿฐ๋ฐ ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์—์„œ๋Š” ๊ฐ„๋‹จํ•ด ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค. n๋ฒˆ์งธ์— ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์ฐพ์•„์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜์Œ๋ถ€ํ„ฐ ์ฐพ๊ธฐ๊ฐ€ ๋ถ€๋‹ด์ด ๋  ์ˆ˜ ์žˆ๋‹ค ๊ทธ๋ž˜์„œ ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋˜์—ˆ๋‹ค.

insertAfter(prev, newNode)

popAfter(prev)

์–ด๋–ค ๋…ธ๋“œ๋ฅผ ์ฃผ๊ณ  ๊ทธ ๋’ค์— ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž… ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋„๋ก ์ •์˜๋ฅผ ํ•œ ๋ฉ”์„œ๋“œ์ด๋‹ค. ํ•˜์ง€๋งŒ ๋งจ ์•ž์—์„œ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ์ง€ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์— ๋งจ์•ž์— dummy node๋ฅผ ์ถ”๊ฐ€ํ•œ ํ˜•ํƒœ๋กœ ์กฐ๊ธˆ ๋ณ€ํ˜•๋œ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

๋”๋ฏธ ๋…ธ๋“œ์— 0๋ฒˆ์„ ๋ถ™์ธ๋‹ค.

 

class LinkedList:
    # ๋”๋ฏธ๋…ธ๋“œ ์ƒ์„ฑํ•˜๋Š” ์ƒ์„ฑ์ž
    def __init__(self):
        self.nodeCount = 0
        self.head = Node(None)
        self.tail = None
        self.head.next = self.tail

 

 

์—ฐ์‚ฐ ์ •์˜

  1. ๊ธธ์ด ์–ป์–ด๋‚ด๊ธฐ
  2. ๋ฆฌ์ŠคํŠธ ์ˆœํšŒ
  3. ํŠน์ • ์›์†Œ(k๋ฒˆ์งธ) ์ฐธ์กฐ
  4. ์›์†Œ ์‚ฝ์ž…
  5. ์›์†Œ ์‚ญ์ œ
  6. ๋‘ ๋ฆฌ์ŠคํŠธ ํ•ฉ์น˜๊ธฐ

 

# ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์—ฐ์‚ฐ - ๋ฆฌ์ŠคํŠธ ์ˆœํšŒ    

    def traverse(self):

        result = []

        curr = self.head

        # ๊ธฐ์กด๊ณผ ๋‹ค๋ฅธ ๋ถ€๋ถ„ curr.next๊ฐ€ ์กด์žฌํ•˜๋Š” ๋™์•ˆ ๋ฐ˜๋ณต

        while curr.next:

            curr = curr.next

            result.append(curr.data)

 

        return result

 

 

 

 

๋ฐ˜์‘ํ˜•
๋Œ“๊ธ€