[자료구조] 링크드리스트(Linked_List) 3

값을 삭제할 때 삭제할 데이터가 없을 때에는?


2편에서 링크드리스트의 데이터를 추가, 삭제하는 과정을 포스팅했는데, 두 가지 오류가 있었다.

1. 코드상에 누락한 부분이 있다.
2. 삭제할 데이터가 링크드리스트 내에 존재하지 않는다면?

1. 누락한 부분 수정

def delete(data):
    global head
    
    if head.data == data: # 삭제하려는 데이터가 head라면?
        node = head
        head = head.next # 새로운 head 지정
        del node # 원래 head node 삭제
        return # 아래쪽의 코드가 실행되지 않도록 함수 종료.
    
    # head가 아니라면 이쪽으로 코드가 넘어온다.

    ############### 누락부분 ###############
    node = head
    #######################################

    while (node.next).data != data:
        node = node.next
    
    temp = (node.next).next
    
    del node.next

    node.next = temp

이 코드에서 누락부분을 제외한 채로 링크드리스트 안에 없는 값을 삭제하라는 코드를 실행해보았다.

delete(1)

그리고 결과는..

while (node.next).data != data:

UnboundLocalError: local variable 'node' referenced before assignment

오류가 발생한 부분은 데이터를 search하는 파트였는데, search 과정의 시작노드를 정해주지 않아서 참조할 변수를 찾을 수 없어 발생하는 오류였다.

누락된 코드 node = head를 넣어주니 다시 잘 작동한다.

2. 삭제할 데이터가 링크드리스트 내에 존재하지 않는 경우.

첫 번째로 누락한 부분은 수정했지만, 링크드리스트 내에 없는 데이터를 삭제하려고 할 경우

while (node.next).data != data:

AttributeError: 'NoneType' object has no attribute 'data'

NoneType관련 AttributeError가 발생한다.
음, 없는 데이터를 삭제하려고 하니 오류가 당연히 발생할 수 밖에…
자, 여기서 발생한 에러가 AttributeError라는 점에 주목했다.

삭제하고자 하는 데이터가 링크드리스트에 없다면 컴퓨터는 링크드리스트 끝까지 search를 진행할 것이다.

하지만 끝까지 갔을 때 node = node.next를 실행하면 node.data는 NoneType이 되며,
while (node.next).data != data: 이 부분에서 오류가 난다.
node에 저장되는 data의 특성은 str, int 혹은 float 등 일테니…

나의 해결방법.

    try:
        while (node.next).data != data:
            node = node.next
        
    except AttributeError:
        print('찾는 코드가 없습니다.')
        return

try, except 구문을 사용하였다.
데이터가 없어서 발생할 수 있는 오류의 종류는 node.data가 NoneType이 되어 발생하는 AttributeError라고 판단하였다. 따라서, 오류가 발생하지 않을 때에는 링크드리스트를 서치하고
node.data = NoneType이 될 때에는 데이터가 없다고 판단하여 AttributeError가 발생, delete()함수를 종료하는 코드로 작성하였다.

아! 그리고 insert() 함수에서도 링크드리스트 내에 데이터가 없으면 같은 오류가 발생할 것이다.
그 부분에서도 try, except구문을 적용한다.
이 시점에서 작성된 코드는

class Node:
    def __init__(self, data, next=None):
        self.data = data
        self.next = next

def add(data):
    node = head
    while node.next:
        node = node.next
        
    node.next = Node(data)
    
    return

def insert(data, new_data):
    node = head
    
    try:
        while node.data != data:
            node = node.next
        
    except AttributeError:
        print('찾는 코드가 없습니다.')
        return
    
    tem = node.next 
    node_new = Node(new_data) 
    node.next = node_new 
    node = node_new
    node.next = tem 
    
    return

def delete(data):
    global head
    
    if head.data == data:
        node = head
        head = head.next
        del node
        return
    
    node = head
    
    try:
        while (node.next).data != data:
            node = node.next
        
    except AttributeError:
        print('찾는 코드가 없습니다.')
        return
        
    temp = (node.next).next
    del node.next
    node.next = temp

    return

def node_print():
    node = head
    while node.next:
        print(node.data)
        node = node.next
    print(node.data)
    
    return

위와 같다. 이 상태에서 아래의 코드를 실행시켜 보았다.

node1 = Node(1)
node2 = Node(2)
node1.next = node2
head = node1

add(3)
add(5)
add('퍄퍄')
node_print()
print()

insert(3, 4)
insert(4, 4.5)
insert(6, '롸롸')
node_print()
print()

delete(1)
node_print()
print(head.data)
print()

delete(3)
node_print()
print()

delete(3)
delete(2)
delete(4)
node_print()

그리고 결과는 아래와 같이 출력되었다.

1
2
3
5
퍄퍄

찾는 코드가 없습니다.
1
2
3
4
4.5
5
퍄퍄

2
3
4
4.5
5
퍄퍄
2

2
4
4.5
5
퍄퍄

찾는 코드가 없습니다.
4.5
5
퍄퍄

휴우.. 에러없이 잘 진행되었다. 링크드리스트 내에 값이 없어서 발생하는 오류는 해결된 듯 하다.
일단은 말이지…

4편에서 계속..


© 2022.07. by Wookey_Kim

Powered by Hydejack v7.5.2