Linked List 개념


현재 학교에서 자료구조 수업을 듣고 있습니다.

자료구조 수업은 개념을 듣고서 이를 실생활이나 머신러닝 라이브러리에 적용되는 사례에 대해 코드로 구현해보고 있습니다.

이번에는 Linked-List에 대한 개념과 이를 python 코드로 구현한 것을 소개해드리고

다음 글에는 List을 활용한 TDM(Term-Document Matrix) - 희소행렬과 희소행렬 곱셈을 수행하는 함수에 대해 소개와 python 코드를 작성해보겠습니다.

Linked List

  • 노드를 연결시킨 자료구조

  • 자료를 연속적인 메모리 공간에 할당할 필요없이 임의 공간에 자료를 저장하고 링크를 이용해 연결함

  • 리스트에서 원소를 탐색하기 위해서는 순차탐색을 하여야 함

  • 배열에서는 삽입/삭제 시 원소 이동이 필요한데 반해 리스트에서는 삽입/삭제가 원활함

  • head에는 사과 노드의 주소가 저장됨

  • 사과노드는 과일을 저장할 수 있는 장소와 다음 노드의 주소를 저장하는 장소로 구성됨

  • 마지막 노드의 링크는 null 이 저장됨

Linked List 설계

  • Node: item으로 value를 가지고 link를 가진다. link가 없을 경우, None을 입력한다.
class Node:
    def __init__(self, item = None):
        self.item = item
        self.link = None
  • root: 리스트 루트 노드이고 Linked List는 root 노드의 주소를 가진다.
# root 노드 만들기

class LinkedList: 
# 변수가 합성어라면 대문자로 구분시켜준다.
# Linked+List
    def __init__(self):
        self.root = Node()

fruits = LinkedList() 
# fruits는 LinkedList 클래스의 인스턴스
  • append method: item을 주면 item 노드를 Linked List 마지막 노드에 추가하는 메소드
class LinkedList:
    def __init__(self):
        self.root = Node()

    def append(self, item):
   # 새로운 노드 생성 
   # 새로운 노드의 root의 item이 None이면 newNode를 
   root로 지정하고
        newNode = Node(item)
        curNode = self.root
        if curNode.item == None:
            self.root = newNode
            
    # 아니면 리스트의 끝까지 이동한 후,
      마지막 노드의 링크에 newNode의 주소를 삽입  
      
        else:
            while curNode.link != None:
                curNode = curNode.link
            curNode.link = newNode
    
    def print(self):
    # 아이템들이 다 print 될 수 있게!
        curNode = self.root
        print(curNode.item)
        while curNode.link != None:
            curNode = curNode.link
            print(curNode.item)
       
  • insert method : index로 새로운 노드를 추가하는 메소드

def listSize(self):
# linked-list의 item 수를 리턴해주는 메소드
    curNode = self.root
    cnt = 1
    while curNode.link != None:
        curNode = curNode.link
        cnt += 1
    return cnt

def insert(self, idx, item):
    n = self.listSize()
    # 예외 처리
    if idx < 0 or idx >= n:
        print("index range error")
    else:
        newNode = Node(item)
        curNode = self.root
        # 인덱스가 0 일 경우 root로 추가
        if idx == 0:
            _tmp = self.root
            self.root = newNode
            newNode.link = _tmp
        else:
        # 해당 위치의 index-1번째 링크에 있는 주소를 대입
        # _tmp 이렇게 쓸경우 주로 버리는 변수에 이용한다
            for curIdx in range(idx-1):
                curNode = curNode.link
            _tmp = curNode.link
            curNode.link = newNode
            newNode.link = _tmp
  • delete 메소드 : 주어진 값을 이용해 해당 노드를 찾고 지운다.
def delete(self,item): 
#item이 들어간다!
    delYN = False
    curNode = self.root
    preNode = curNode
    # 첫번째 노드와 같다면 링크에 대입
    if curNode.item == item:
        self.root = self.root.link
        delYN = True
    else:
    #중간 노드라면 index-1번째 링크에 item을 대입
        while curNode.link != None:
            preNode = curNode
            curNode = curNode.link
            if curNode.item == item:
                preNode.link = curNode.link
                delYN = True 
    # 마지막 노드였다면 마지막 링크에 none을 대입
    if curNode.item == item:
        preNode.link = None
        delYN = True
     # 예외 처리
    if delYN == False:
        print("delete failed")
  • find method : Linked List에서 해당 아이템을 찾고 index를 리턴한다. 없으면 -1을 리턴한다.
def find(self, item):
# 마찬가지로 item을 기준으로!
# index을 리턴하기위해 -1부터 시작!
    find = -1
    idx = 0
    if self.root.item == item:
        find += 1
    else:
        curNode = self.root
        while curNode.link != None:
            curNode = curNode.link
            idx += 1
            if curNode.item == item:
                find = idx
                print(find)
            else:
            	print('Not in LinkedList')

참고

생활코딩

초 몽키의 블로그




© 2018. by Gangmin

Powered by zzsza