반원 블로그

02b. 단일 연결 리스트(singly linked list) - iv. 삭제 본문

2018~/파이썬 자료구조 알고리즘

02b. 단일 연결 리스트(singly linked list) - iv. 삭제

반원_SemiCircle 2019. 4. 30. 03:43

삭제

먼저 삭제되는 데이터에 대한 처리를 얘기하려합니다. C언어의 경우 메모리의 할당 및 해제를 직접 코드에 적어줘야합니다.(malloc과 free) 즉, 관리에서 벗어날 데이터는 할당되었던 메모리를 해제하는 것까지 신경써야됩니다.

하지만 JAVA나 Python은 관리에서 벗어난 데이터의 경우 알아서 처리해주는 가비지 컬렉션(Garbage Collection) 개념을 사용합니다. 그래서 우리는 삭제된 데이터의 메모리 해제는 신경쓰지않고, 관리 체계에 대해서만 생각하면 됩니다.

저장된 노드가 없을 때

당연히 중지시켜야됩니다.

#단일 링크드 리스트
class SLinkedList:

    #S_L_list에서 쓸 노드
    class Node:
        def __init__(self, v, n = None):
            self.value = v #저장된 데이터
            self.next = n #다음 노드 가리키는 변수

    #S_L_List에서 필요한 변수
    def __init__(self):
        self.head = None #첫 생성시 내부에는 노드가 없으므로

    #삽입
    def insertNode(self, v): #추가할 데이터
        #만일 처음 노드일 경우 -> head값이 None임
        if self.head is None :
            #head에 새 노드를 저장
            self.head = self.Node(v)
        else: #이미 노드가 있는 경우
            # head에 새 노드를 저장
            # 기존 head에 저장된 노드는 새로 생성할 노드의 next로 저장
            self.head = self.Node(v,self.head)

    def printNode(self):
        #데이터가 없을 때
        if self.head is None:
            print("저장된 데이터가 없음")
            return
        else:
            print("<현재 리스트 구조>", end='\t') #end로 print 마지막 개행을 변경할 수 있습니다.
            link = self.head #처음은 head를 지정. 이후부터는 현 노드의 next를 지정

            #link가 가리키는 노드가 없을 때까지 반복
            #None,0,""는 조건판단에서 False 처리, 그 외는 True로 처리된다.
            while link :
                print(link.value, '->' , end = ' ')
                link = link.next #link를 현 위치 노드의 next로 변경
            print() #줄바꿈 용

    #삭제
    def deleteNode(self):
        #노드가 없으면 skip
        if self.head is None :
            print("삭제할 노드가 없습니다.")
            return

##테스트
if __name__=="__main__":
    sl = SLinkedList()
    sl.deleteNode()

저장된 노드가 있을 때

삭제는 head가 가리키고 있는 노드가 삭제된다.(파이썬에서 딱히 메모리 해제를 하지 않으니 삭제라기보단 관리에서 제외시킨다는 개념이 맞겠습니다.)
결과적으로 head에 다음 노드를 가리키도록 변경하면 됩니다.

코드 구현

#단일 링크드 리스트
class SLinkedList:

    #S_L_list에서 쓸 노드
    class Node:
        def __init__(self, v, n = None):
            self.value = v #저장된 데이터
            self.next = n #다음 노드 가리키는 변수

    #S_L_List에서 필요한 변수
    def __init__(self):
        self.head = None #첫 생성시 내부에는 노드가 없으므로

    #삽입
    def insertNode(self, v): #추가할 데이터
        #만일 처음 노드일 경우 -> head값이 None임
        if self.head is None :
            #head에 새 노드를 저장
            self.head = self.Node(v)
        else: #이미 노드가 있는 경우
            # head에 새 노드를 저장
            # 기존 head에 저장된 노드는 새로 생성할 노드의 next로 저장
            self.head = self.Node(v,self.head)

    def printNode(self):
        #데이터가 없을 때
        if self.head is None:
            print("저장된 데이터가 없음")
            return
        else:
            print("<현재 리스트 구조>", end='\t') #end로 print 마지막 개행을 변경할 수 있습니다.
            link = self.head #처음은 head를 지정. 이후부터는 현 노드의 next를 지정

            #link가 가리키는 노드가 없을 때까지 반복
            #None,0,""는 조건판단에서 False 처리, 그 외는 True로 처리된다.
            while link :
                print(link.value, '->' , end = ' ')
                link = link.next #link를 현 위치 노드의 next로 변경
            print() #줄바꿈 용

    #삭제
    def deleteNode(self):
        #노드가 없으면 skip
        if self.head is None :
            print("삭제할 노드가 없습니다.")
            return
        else:
            #head를 현 head의 next. 즉, 다음 노드로 변경.
            self.head = self.head.next

##테스트
if __name__=="__main__":
    sl = SLinkedList()
    sl.insertNode('1st')
    sl.insertNode('2nd')
    sl.insertNode('3rd')
    sl.printNode()  # 출력
    sl.deleteNode()
    sl.deleteNode()
    sl.printNode()  # 출력
    sl.deleteNode()
    sl.deleteNode()
    sl.printNode()  # 출력

위키독스 연재 : https://wikidocs.net/book/2868

Comments