ABOUT ME

전설입니다.

  • 자료구조 링크드 리스트(Linked List)4
    자료구조와 알고리즘 2020. 10. 22. 15:42

    다양한 링크드 리스트 구조

     만약에 링크드 리스트 노드가 만개라면 찾고자 하는 데이터가 하필 만번이라면 첨부터 만까지 검색해야 되니까 시간이 걸린다. 근데 끝에서 부터 검색을 할 수 있다면 좋겠다. 내가 찾고자 하는 데이터의 범위를 알면 조금더 빠르게 데이터를 찾을수 있지 않을까해서 나온 더블링크드 리스트

     

    이전주소 데이터 1 다음주소
    이전주소 데이터 2 다음주소

     

     

    class Node:
        def __init__(self, data, prev=None, next=None):
            self.prev = prev
            self.data = data
            self.next = next
    
    class NodeMgmt:
        def __init__(self, data):
            self.head = Node(data)
            self.tail = self.head
    
        def insert(self, data):
            if self.head == None:
                self.head = Node(data)
                self.tail = self.head
            else:
                node = self.head
                while node.next:
                    node = node.next
                new = Node(data)
                node.next = new
                new.prev = node
                self.tail = new
    
        def desc(self):
            node = self.head
            while node:
                print (node.data)
                node = node.next

    오 위의 그림을 보면서 이해하니 쉽군요

     

    더블 링크드 리스트 값 추가하기

    class Node:
        def __init__(self, data, prev=None, next=None):
            self.prev = prev
            self.data = data
            self.next = next
    
    class NodeMgmt:
        def __init__(self, data):
            self.head = Node(data)
            self.tail = self.head
    
        def insert(self, data):
            if self.head == None:
                self.head = Node(data)
                self.tail = self.head
            else:
                node = self.head
                while node.next:
                    node = node.next
                new = Node(data)
                node.next = new
                new.prev = node
                self.tail = new
    
        def desc(self):
            node = self.head
            while node:
                print (node.data)
                node = node.next
        
        def search_from_head(self, data):
            if self.head == None:
                return False
        
            node = self.head
            while node:
                if node.data == data:
                    return node
                else:
                    node = node.next
            return False
        
        def search_from_tail(self, data):
            if self.head == None:
                return False
        
            node = self.tail
            while node:
                if node.data == data:
                    return node
                else:
                    node = node.prev
            return False
        
        def insert_before(self, data, before_data):
            if self.head == None:
                self.head = Node(data)
                return True
            else:
                node = self.tail
                while node.data != before_data:
                    node = node.prev
                    if node == None:
                        return False
                new = Node(data)
                before_new = node.prev
                before_new.next = new
                new.prev = before_new
                new.next = node
                node.prev = new
                return True

     

     

    연습4: 위 코드에서 노드 데이터가 특정 숫자인 노드 뒤에 데이터를 추가하는 함수를 만들고, 테스트해보기
    - 더블 링크드 리스트의 head 에서부터 다음으로 이동하며, 특정 숫자인 노드를 찾는 방식으로 함수를 구현하기
    - 테스트: 임의로 0 ~ 9까지 데이터를 링크드 리스트에 넣어보고, 데이터 값이 1인 노드 다음에 1.7 데이터 값을 가진 노드를 추가해보기

     

    class Node:
        def __init__(self, data, prev=None, next=None):
            self.prev = prev
            self.data = data
            self.next = next
    
    class NodeMgmt:
        def __init__(self, data):
            self.head = Node(data)
            self.tail = self.head
        
        def insert_before(self, data, before_data):
            if self.head == None:
                self.head = Node(data)
                return True            
            else:
                node = self.tail
                while node.data != before_data:
                    node = node.prev
                    if node == None:
                        return False
                new = Node(data)
                before_new = node.prev
                before_new.next = new
                new.next = node
                return True
    
        def insert_after(self, data, after_data):
            if self.head == None:
                self.head = Node(data)
                return True            
            else:
                node = self.head
                while node.data != after_data:
                    node = node.next
                    if node == None:
                        return False
                new = Node(data)
                after_new = node.next
                new.next = after_new
                new.prev = node
                node.next = new
                if new.next == None:
                    self.tail = new
                return True
    
        def insert(self, data):
            if self.head == None:
                self.head = Node(data)
            else:
                node = self.head
                while node.next:
                    node = node.next
                new = Node(data)
                node.next = new
                new.prev = node
                self.tail = new
    
        def desc(self):
            node = self.head
            while node:
                print (node.data)
                node = node.next
    node_mgmt = NodeMgmt(0)
    for data in range(1, 10):
        node_mgmt.insert(data)
    
    node_mgmt.insert_after(1.5, 1)
    node_mgmt.desc()

    0

    1

    1.5

    2

    ....

    9

전설의 개발자