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

๋ฐ˜์‘ํ˜•

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

์ตœ๋Œ€ ์žฅ์  ์‚ฝ์ž…/์‚ญ์ œ๊ฐ€ ์œ ์—ฐํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด n๋ฒˆ์งธ์— ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์ฐพ์•„์„œ ์‚ฝ์ž…/์‚ญ์ œ๊ฐ€ ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ฐ’์„ ์ฐพ์•„๊ฐ€๊ธฐ๊ฐ€ ๋ถ€๋‹ด์Šค๋Ÿฌ์›Œ์„œ ๊ฐ„๋‹จํ•œ ์ผ์€ ์•„๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋Ÿฌํ•œ ๋ถ€๋‹ด์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์กฐ๊ธˆ ๋‹ค๋ฅธ ๊ตฌ์กฐ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ ๋‹ค.

  • insertAfter(prev, newNode)
  • popAfter(prev)

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

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

 

 

 

 

 

 

์กฐ๊ธˆ ๋ณ€ํ˜•๋œ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ

# LinkedList ํด๋ž˜์Šค
class LinkedList:
    # ์ƒ์„ฑ์ž
    def __init__(self):
        self.nodeCount = 0
        self.head = Node(None)
        self.tail = None
        self.head.next = self.tail

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ์ƒ์„ฑ์ž๋ฅผ ๋ณ€๊ฒฝ

 

 

 

 

 

 

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

    # ๋ฆฌ์ŠคํŠธ ์ˆœํšŒ
    def traverse(self):
        result = []
        curr = self.head
        # ํ˜„์žฌ ๋…ธ๋“œ์˜ next๊ฐ€ ์กด์žฌํ•˜๋Š” ๋™์•ˆ ๋ฐ˜๋ณต
        while curr.next:
            result.append(curr.data)
            curr = curr.next
        return result

 

 

 

 

 

k๋ฒˆ์งธ ์›์†Œ ์–ป์–ด๋‚ด๊ธฐ

๋”๋ฏธ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์œผ๋‹ˆ ์—๋Ÿฌ์ง€์ ๊ณผ ์‹œ์ž‘์ ์„ ๋ณ€๊ฒฝํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค. getAt(0) -> head

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

 

 

 

 

 

์›์†Œ์˜ ์‚ฝ์ž…

def insertAfter(self, prev, newNode)

๋…ธ๋“œ prev๊ฐ€ ํ•˜๋‚˜ ์ฃผ์–ด์ง€๊ณ  ์‚ฝ์ž…ํ•˜๋ ค๋Š” ๋…ธ๋“œ newNode๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. prev๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” node์˜ ๋‹ค์Œ์— newNode๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ์„ฑ๊ณต/์‹คํŒจ์— ๋”ฐ๋ผ True/False๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

 

 

์›์†Œ์˜ ์‚ฝ์ž… ํ๋ฆ„

์ฒ˜์Œ ์ƒํƒœ
newNode.next = prev.next
prev.next = NewNode

 

 

๋งจ ๋์— ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.
๋งํฌ๋„ ์กฐ์ ˆํ•ด์•ผํ•˜์ง€๋งŒ tail๋„ ์กฐ์ ˆํ•ด์ค˜์•ผํ•œ๋‹ค.

    # ์›์†Œ์˜ ์‚ฝ์ž…
    def insertAfter(self, prev, newNode):
        newNode.next = prev.next
        # ๋งจ ๋’ค์— ์‚ฝ์ž…์„ ํ•˜๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด tail๋„ ์กฐ์ •ํ•ด์ค˜์•ผํ•จ
        if prev.next is None:
            self.tail = newNode
        prev.next = newNode
        self.nodeCount += 1
        return True

 

 

 

๋ฉ”์„œ๋“œ insertAt()์˜ ๊ตฌํ˜„

์ด๋ฏธ ๊ตฌํ˜„ํ•œ insertAfter()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ด์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ

  1. pos ๋ฒ”์œ„ ์กฐ๊ฑด ํ™•์ธ
  2. pos == 1์ธ ๊ฒฝ์šฐ์—๋Š” head ๋’ค์— ์ƒˆ node ์‚ฝ์ž…
  3. pos == nodeCount + 1 (๋งจ ๋)์ธ ๊ฒฝ์šฐ์—๋Š” prev <- tail
  4. ๊ทธ๋ ‡์ง€ ์•Š์€(๋งจ ๋์ด ์•„๋‹Œ) ๊ฒฝ์šฐ์—๋Š” ํ•˜๋‚˜ํ•˜๋‚˜ ์ฐพ์•„์•ผํ•œ๋‹ค. prev <- getAt(...)

 

    # ์ƒˆ๋กœ์šด ์›์†Œ์˜ ์‚ฝ์ž…
    def newInsertAt(self, pos, newNode):
        # ๋ฒ”์œ„ ์œ ํšจ์„ฑ ํ™•์ธ
        if pos < 1 or pos > self.nodeCount + 1:
            return False
        
        # pos ๊ฐ€ 1์ผ๋•Œ๋Š” ๋นˆ ๊ณต๊ฐ„์— ์‚ฝ์ž…ํ•˜๋Š” ๊ฒฝ์šฐ๋‹ˆ๊นŒ tail์„ ๋„ฃ์–ด์ฃผ๋ฉด ์•ˆ๋œ๋‹ค. 
        if pos != 1 and pos == self.nodeCount + 1:
            prev = self.tail
        
        else:
            prev = self.getAt(pos-1)
        
        return self.insertAfter(prev, newNode)

 

 

 

 

 

์›์†Œ์˜ ์‚ญ์ œ

def popAfter(self, prev):

prev์˜ ๋‹ค์Œ node๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๊ทธ node์˜ data๋ฅผ ๋ฆฌํ„ด

 

 

์›์†Œ์˜ ์‚ญ์ œ ํ๋ฆ„

์ฒ˜์Œ ์ƒํƒœ
๋งํฌ ์กฐ์ • ํ›„ curr๊บผ๋‚ด์„œ ๋ฆฌํ„ด

 

 

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

1. prev๊ฐ€ ๋งˆ์ง€๋ง‰ node ์ผ ๋•Œ (prev.next == None)

  • ์‚ญ์ œํ•  node์—†์Œ
  • return None

2. ๋ฆฌ์ŠคํŠธ ๋งจ ๋ node๋ฅผ ์‚ญ์ œํ•  ๋•Œ (curr.next == None)

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

 

 

popAfter() ๊ตฌํ˜„

    def popAfter(self, prev):
        # prev๋‹ค์Œ์— ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ์‚ญ์ œํ•  ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋‹ˆ None ๋ฆฌํ„ด
        if prev.next == None:
            return None
            
        # ์‚ญ์ œํ•˜๋ ค๋Š” ๋…ธ๋“œ๋ฅผ curr์— ๋‹ด๊ธฐ
        curr = prev.next
        
        # ์‚ญ์ œํ•  ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ
        if curr.next == None:
            # ์œ ์ผํ•œ ๋…ธ๋“œ์ผ ๋•Œ
            if self.nodeCount == 1:
                self.tail = None
            # ์œ ์ผํ•œ ๋…ธ๋“œ๊ฐ€ ์•„๋‹ ๋•Œ
            else:
                self.tail = prev
        
        # ๋งํฌ ์กฐ์ •
        prev.next = curr.next
        self.nodeCount -= 1
        return curr.data

 

popAt() ๊ตฌํ˜„

    def newPopAt(self, pos):
        if pos < 1 or pos > self.nodeCount:
            raise IndexError
        prev = self.getAt(pos-1)
        return self.popAfter(prev) 

 

 

 

 

 

 

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

์ฒ˜์Œ์ƒํƒœ

 

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