Linked List

  • 링크드리스트 : 연결리스트는 데이터를 담고있는 노드(node)와 노드를 연결하는 링크(link)로 이루어져 있다. 정적 자료구조인 배열과 달리 동적인 자료구조
  • 연결리스트는 배열과 달리 메모리에 연속적으로 할당되지 않고 메모리상에 임의로 할당되고 흩어진 각 요소를 링크(link)에 의해 연결된다.
링크드리스트 구조

링크드리스트 삭제 구조


In [2]:
# Node 클래스 정의
class Node:
    def __init__(self, data):
        self.data = data # Node
        self.next = None # Link


# LinkedList 클래스 (자료구조) 정의
class LinkedList:

    # 초기화 메소드
    def __init__(self):
        dummy = Node("dummy")
        self.head = dummy # 링크드리스트의 head
        self.tail = dummy # 링크드리스트의 tail

        self.current = None
        self.before = None

        self.num_of_data = 0

    # append 메소드 (insert - 맨 뒤에 노드 추가, tail과 node의 next, 데이터 개수 변경)
    def append(self, data):
        new_node = Node(data)
        # tail.next 에는 Node(data) 의 값이 들어감.
        self.tail.next = new_node
        self.tail = new_node

        self.num_of_data += 1

    # delete 메소드 (delete - current 노드 삭제, 인접 노드의 current, next 변경, 데이터 개수 변경)
    def delete(self):
        pop_data = self.current.data

        if self.current is self.tail:
            self.tail = self.before

        self.before.next = self.current.next
        self.current = self.before # 중요 : current가 next가 아닌 before로 변경된다.
        #

        self.num_of_data -= 1

        return pop_data

    # first 메소드 (search1 - 맨 앞의 노드 검색, before, current 변경)
    def first(self):
        if self.num_of_data == 0: # 데이터가 없는 경우 첫번째 노드도 없기 때문에 None 리턴
            return None

        self.before = self.head
        self.current = self.head.next

        return self.current.data

    # next 메소드 (search2 - current 노드의 다음 노드 검색, 이전에 first 메소드가 한번은 실행되어야 함)
    def next(self):
        if self.current.next == None:
            return None

        self.before = self.current
        self.current = self.current.next

        return self.current.data

    def size(self):
        return self.num_of_data

l_list = LinkedList()
l_list.append(5)
l_list.append(2)
l_list.append(1)
l_list.append(2)
l_list.append(7)
l_list.append(2)
l_list.append(11)

print('first node value :', l_list.first())     
print('next node value :', l_list.next())       
print('delete node:', l_list.delete())    
print('size or linked list :', l_list.size())


first node value : 5
next node value : 2
delete node: 2
size or linked list : 6