알고리즘

링크드 리스트 구현 - 2

na_o 2021. 8. 22. 04:16
728x90

[Linked List에서 index번째 원소를 반환하기]

현재의 index(current_index)가 매개변수 index 값과 같아질 때까지

노드를 한 칸씩 이동하면서, 한 칸 이동할 때 현재의 index값을 1씩 증가시킴

    def get_node(self, index):
        current_index = 0
        current_node = self.head
        while current_index < index:
            current_node = current_node.next
            current_index += 1
        return current_node

 

 

 

[내가 만든 get_node 함수]

노드를 한 칸 이동한 즉시 현재index(current_index)와 매개변수 index의 값을 비교하여

값이 같을 때 current_node를 반환

현재index와 매개변수 index의 값이 다를 경우

노드를 또 한 칸 이동하면서 현재index의 값을 1 증가시킴

위의 과정을 현재 노드(current_node)가 None이 될 때까지 반복함

한 칸 씩 이동하면서 현재index와 매개변수 index를 비교했을 때 결국 현재index와 매개변수 index가 같은 값을 못찾았다면 "None!!"이라는 문자열을 출력함

   def get_node(self, index):
        current_index = 0
        current_node = self.head
        while current_node is not None:
            if current_index == index:
                return current_node
            current_node = current_node.next
            current_index += 1
        return "None!!"

[Linked List에서 index번째 원소를 추가하기]

현재 노드의 다음 노드를 새로운 노드와 연결

새로운 노드의 다음 노드를 이전에 저장해놓은 노드에 연결

    def add_node(self, index, value):
        new_node = Node(value)
        # index-1 때문에 예외처리를 해줘야함
        if index == 0:
            new_node.next = self.head
            self.head = new_node  # Linked List의 맨 앞에 새 노드가 들어가야 함
            return
            
        # index-1:
        # index 위치에 노드를 추가하고 싶은거니까 바로 이전 노드에 이어붙여야함
        node = self.get_node(index-1)
        next_node = node.next
        node.next = new_node
        new_node.next = next_node

 

 

 

[내가 만든 add_node 함수]

index-1인 이유: index 위치에 노드를 추가하고 싶은거니까 바로 이전 노드에 새 노드를 이어붙여야함

current_index가 index-1과 같아질 때 까지 current_node에 다음 노드를 저장하고 current_index를 1 증가시킴

index-1위치에 있는 노드의 다음 노드를 next_node에 저장하고

index 위치에 새노드를 만들어 새 노드의 다음노드에 next_node값을 저장

    def add_node(self, index, data):
        current_index = 0
        current_node = self.head
        while current_index < index - 1:
            current_node = current_node.next
            current_index += 1
        next_node = current_node.next
        current_node.next = Node(data)
        current_node.next.next = next_node

[Linked List에서 index번째 원소 제거]

index-1의 위치에 있는 노드의 다음 노드(next변수)에

index-1의 위치에 있는 노드의 다음 다음 노드를 저장

    def delete_node(self, index):
        # index-1에 대한 예외처리
        # 가장 맨 앞에 있는 노드를 그 다음에 있는 노드로 바꿈
        if index == 0:
            self.head = self.head.next
            return
        node = self.get_node(index - 1)
        node.next = node.next.next

 

 

 

[내가 만든 delete_node 함수]

index-1에 있는 노드의 다음 노드에다가

index+1에 있는 노드를 이어붙임

index-1과 index+1에 대해 예외처리도 해줌

    def get_node_length(self):
        count = 0
        current_node = self.head
        while current_node.next is not None:
            current_node = current_node.next
            count += 1
        return count

    def delete_node(self, index):
        # index가 노드의 맨 끝과 같다면 맨 끝의 이전 노드의 next 변수값을 없애버림
        if index == self.get_node_length():
            self.get_node(index-1).next = None
            return
        
        # index가 맨 첫번째 노드를 말한다면 두번째 노드를 Linked List의 head로 설정
        if index == 0:
            self.head = self.get_node(index+1)
            return
            
        node = self.get_node(index-1)
        node.next = self.get_node(index+1)

[전체 코드]

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


class LinkedList:
    def __init__(self, data):
        self.head = Node(data)

    def append(self, data):
        if self.head is None:
            self.head = Node(data)
            return

        current_node = self.head
        while current_node.next is not None:
            current_node = current_node.next
        current_node.next = Node(data)

    def print_all(self):
        if self.head is None:
            print("Node is None")
            return

        current_node = self.head
        while current_node is not None:
            print(current_node.data)
            current_node = current_node.next

    def get_node(self, index):
        current_index = 0
        current_node = self.head
        while current_index < index:
            current_node = current_node.next
            current_index += 1
        return current_node

    def add_node(self, index, value):
        new_node = Node(value)
        if index == 0:
            new_node.next = self.head
            self.head = new_node
            return

        node = self.get_node(index - 1)
        next_node = node.next
        node.next = new_node
        new_node.next = next_node

    def get_node_length(self):
        count = 0
        current_node = self.head
        while current_node.next is not None:
            current_node = current_node.next
            count += 1
        return count

    def delete_node(self, index):
        if index == 0:
            self.head = self.head.next
            return
        node = self.get_node(index - 1)
        node.next = node.next.next

'알고리즘' 카테고리의 다른 글

이진탐색  (0) 2021.08.23
링크드 리스트 문제  (0) 2021.08.22
링크드 리스트 구현 - 1  (0) 2021.08.21
클래스  (0) 2021.08.21
Array와 Linked List  (0) 2021.08.19