class Node:
    def __init__(self, data, prev = None, next = None):
        self.data = data
        self.prev = prev
        self.next = next
        
class NodeMgmt:
    def __init__(self, data):
        self.head = Node(data)
        self.tail = self.head
        
    def add(self, data):
        if self.head == "":
            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 insert_front(self, data, index):
        node = self.head
        new = Node(data)
        
        for i in range(index-1):
            node = node.next
            
        temp = node.next
        node.next = new
        new.next = temp
        new.prev = node
        
        if new.next == None:
            self.tail = new
        
    def insert_back(self, data, index):
        node = self.head
        new = Node(data)
        
        if (index == 1):
            temp = node
            self.head = new
            new.next = temp
            node.prev = new
            
        else:
            NodeMgmt.insert_front(self, data, index-1)

이중 연결리스트이다.

 

전에 있던 연결리스트와 다르게 리스트의 뒤로도 움직일 수 있다.

맨 처음을 가리키는 head와 맨 마지막을 가리키는 tail이 있다.

 

전에 있던 연결리스트와 다르게 새로운 노드를 추가할 때 전에 있던 노드의 next와 prev를 둘 다 고려해줘야 한다. 

'Algorithms > 패캠 알고리즘 강의' 카테고리의 다른 글

시간 복잡도(2)  (0) 2020.01.21
시간 복잡도(1)  (0) 2020.01.20
연결 리스트(3)  (0) 2020.01.17
연결리스트(2)  (0) 2020.01.17
연결 리스트 (1)  (0) 2020.01.17
class Node:
    def __init__(self, data, next = None):
        self.data = data
        self.next = next
        
class NodeMgmt:
    def __init__(self, data):
        self.head = Node(data)
        
    def add(self, data):
        if self.head == "":
            self.head = Node(data)
            
        else:
            node = self.head
            while node.next:
                node = node.next
                
            node.next = Node(data)
            
    def desc(self):
        node = self.head
        while node:
            print(node.data)
            node = node.next
            
    def delete(self, data):
        if (self.head == ""):
            print("데이터가 존재하지 않습니다.")
            return
        
        if (self.head.data == data):
            temp = self.head
            self.head = self.head.next
            del temp
        
        else:
            node = self.head
        
            while node.next:
                if node.next.data == data:
                    temp = node.next
                    node.next = node.next.next
                    del temp
                    return
                
                else:
                    node = node.next

전에 있던 코드에 delete 기능을 추가해봤다.

 

첫번째 if문은 방어 코드이다. 혹시나 head 값이 없을 경우를 대비해서

 

두번째 if문은 지우려는 데이터가 첫번째 헤드 데이터일 경우에 삭제하는 코드이다.

 

첫번째 노드를 temp에 넣고 두번째 노드를 head로 지정해주고 첫번째 노드를 담고 있던 temp 변수를 지워준다.

 

else문은 삭제하고자 하는 노드가 중간에 있을 경우와 마지막에 있을 경우를 동시에 고려해준다.

 

while문을 써서 만약 현재 노드의 다음노드의 데이터가 삭제하려는 데이터와 같을 경우에는 다음 노드를 temp에 넣어주고 그 다음 노드를 다음 노드 자리로 가지고 온다.

 

이 else문이 마지막 노드일 경우에도 성립하는 이유는 다음 노드의 포인터는 현재 아무것도 들어 있지 않은 상태이다. 왜냐하면 마지막 노드이기 때문이다.

 

마지막 노드를 지우면 현재 노드의 .next는 None 되어야 현재 노드가 마지막 노드가 된다.

 

그래서 마지막 노드의 None 값을 현재 노드의 .next에다가 넣는 것이다.

 

'Algorithms > 패캠 알고리즘 강의' 카테고리의 다른 글

시간 복잡도(2)  (0) 2020.01.21
시간 복잡도(1)  (0) 2020.01.20
연결리스트(4)  (0) 2020.01.17
연결리스트(2)  (0) 2020.01.17
연결 리스트 (1)  (0) 2020.01.17
class Node:
    def __init__(self, data, next = None):
        self.data = data
        self.next = next
        
class NodeMgmt:
    def __init__(self, data):
        self.head = Node(data)
        
    def add(self, data):
        if self.head == "":
            self.head = Node(data)
            
        else:
            node = self.head
            
            while node.next:
                node = node.next
                
            node.next = Node(data)
            
    def desc(self):
        node = self.head
        while node:
            print(node.data)
            node = node.next

전에 있던 연결리스트를 클래스를 나눠서 구현해봤다.

 

if문을 쓴 부분은 방어 코드라고 해서 혹시나 head에 아무값도 없을 경우를 고려하여 넣어줬다.

 

NodeMgmt를 사용할 경우 연결리스트의 노드가 하나도 없을 경우에 생성과 동시에

head 변수에 첫번째 노드를 저장할 수 있다.

그러면 Node를 사용하여 노드를 만들었을 때는 head값을 지정해줘야했던 단점을 개선할 수 있다.

 

desc는 존재하는 모든 node의 data를 출력하는 메소드이다.

 

'Algorithms > 패캠 알고리즘 강의' 카테고리의 다른 글

시간 복잡도(2)  (0) 2020.01.21
시간 복잡도(1)  (0) 2020.01.20
연결리스트(4)  (0) 2020.01.17
연결 리스트(3)  (0) 2020.01.17
연결 리스트 (1)  (0) 2020.01.17