본문 바로가기
Computer Science/Data Structure

단방향 연결 리스트 구현

by 데이터현 2021. 12. 13.
class Node:
    # 단방향 연결 리스트 위한 노드
    def __init__(self,key = None):
        self.key = key
        self.next = None
    def __str__(self):
        return str(self.key)
        # v = Node()
        # print(v.key) # key값 출력
        # print(v) -> print(v.__str__()) 와 같음
'''
보통 이렇게 하지 않음 (매번 변수 선언)
a = Node(3)
b = Node(9)
c = Node(-1)
a.next = b
b.next = c
'''
class SinglyLinkedList:
    def __init__(self):
        self.head = None
        self.size = 0

    def pushFront(self,key):
        # O(1)
        v = Node(key)
        v.next = self.head
        self.head = v
        self.size += 1

    def pushBack(self,key):
        # O(n)
        v = Node(key)
        if len(self) == 0:
            self.head = v
        else:
            tail = self.head
            while tail.next != None:
                tail = tail.next
            tail.next = v
        self.size += 1
    
    def popFront(self):
        # O(1)
        if len(self) == 0:
            return None
        else: # 하나 이상은 존재
            x = self.head
            key = x.key
            self.head = x.next
            self.size -= 1
            del x
            return key

    def popBack(self):
        # O(n)
        if len(self) == 0:
            return None
        else:
            prev, tail = None, self.head
            while tail.next != None:
                prev = tail
                tail = tail.next
            if len(self) == 1:
                self.head = None
            else:
                prev.next = tail.next
            key = tail.key
            del tail
            self.size -= 1
            return key

    def __len__(self):
        return self.size
    
    def search(self, key):
        # key 값의 노드를 리턴, 없으면 None 리턴
        # O(n)
        v = self.head
        while v != None:
            if v.key == key:
                return v
            v = v.next
        return None

    # generator 스페셜 메소드 선언
    # search 연산과 비슷
    def __iter__(self):
        v = self.head
        while v != None:
            yield v # yield 는 return과 비슷
            v = v.next

L = SinglyLinkedList()
L.pushFront(1)
L.pushFront(2)
L.pushFront(3)
for x in L:
    print(x)

'Computer Science > Data Structure' 카테고리의 다른 글

해시 테이블 - collision resolution method  (0) 2021.12.31
해시 테이블  (0) 2021.12.29
양방향 연결 리스트 구현  (0) 2021.12.28
스택 큐 자료구조 구현  (0) 2021.12.12
자료구조와 알고리즘  (0) 2021.12.08

댓글