반원 블로그

02c. 이중 연결 리스트(doubly linked list) - ii. 삽입 본문

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

02c. 이중 연결 리스트(doubly linked list) - ii. 삽입

반원_SemiCircle 2019. 5. 3. 02:34

삽입

이중 연결리스트의 삽입 방법은 2가지입니다. 단일 연결 리스트처럼 head로 넣는 방법과 같은 방법으로 tail을 통해 넣는 방법.

각 상황에 따라 노드의 next와 prev값을 다음노드와 이전노드로 지정해주면 됩니다.

저장된 노드가 없는 경우(head,tail)

아무런 노드도 없는 경우는 head와 tail 값이 None입니다. 따라서 head를 통해 넣든, tail을 통해 넣든 결과가 같습니다.

코드 구현

#이중 링크드 리스트
class DLinkedList:

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

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

    #head로 삽입. v : 데이터
    def insertNodeBefore(self, v):
        #없을 경우
        if self.head is None:
            self.head = self.Node(v)
            self.tail = self.head #같은 노드를 가리킴

    #tail로 삽입. v : 데이터
    def insertNodeAfter(self, v):
        #없을 경우
        if self.tail is None:
            self.tail = self.Node(v)
            self.head = self.tail #같은 노드를 가리킴

##테스트
if __name__=="__main__":
    dl = DLinkedList()
    # dl.insertNodeAfter('FirstData') #head삽입 테스트
    dl.insertNodeBefore('LastData') #tail삽입 테스트

저장된 노드가 있는 경우(head)

새로운 노드만 신경쓰면 좋겠지만, 기존에 head를 차지하던 노드도 신경써야합니다. 왜냐하면 기존에 있던 노드의 prev를 새로 만드는 노드를 가리키도록 해야합니다.

따라서 다음 수행절차를 진행하겠습니다.

  1. 현재 head가 가리키는 기존 노드의 prev를 새로 생성하는 노드로 지정
  2. 새로 생성한 노드의 next를 기존 노드로 지정
  3. head를 새로 생성한 노드로 변경

코드 구현

#이중 링크드 리스트
class DLinkedList:

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

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

    #head로 삽입. v : 데이터
    def insertNodeBefore(self, v):
        #없을 경우
        if self.head is None:
            self.head = self.Node(v)
            self.tail = self.head #같은 노드를 가리킴
        else:
            #self.head : 기존노드, self.head.prev : 기존노드의 prev
            self.head.prev = self.Node(v,n=self.head) #1,2번을 동시수행
            #self.head.prev : 기존노드의 prev == 새로운 노드
            self.head = self.head.prev #3. head를 새로운 노드로 변경

##테스트
if __name__=="__main__":
    dl = DLinkedList()
    dl.insertNodeBefore('1st')  # head삽입 테스트
    dl.insertNodeBefore('2nd')  # head삽입 테스트
    dl.insertNodeBefore('3rd')  # head삽입 테스트

저장된 노드가 있는 경우(tail)

head와 유사한 점이 많습니다. 단지 head가 tail로, prev를 next로, next를 prev로 바꿔서 생각하면 됩니다.

따라서 다음 수행절차를 진행하겠습니다.

  1. 현재 tail가 가리키는 기존 노드의 next를 새로 생성하는 노드로 지정
  2. 새로 생성한 노드의 prev를 기존 노드로 지정
  3. tail를 새로 생성한 노드로 변경
#이중 링크드 리스트
class DLinkedList:

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

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

    #head로 삽입. v : 데이터
    def insertNodeBefore(self, v):
        #없을 경우
        if self.head is None:
            self.head = self.Node(v)
            self.tail = self.head #같은 노드를 가리킴
        else:
            #self.head : 기존노드, self.head.prev : 기존노드의 prev
            self.head.prev = self.Node(v,n=self.head) #1,2번을 동시수행
            #self.head.prev : 기존노드의 prev == 새로운 노드
            self.head = self.head.prev #3. head를 새로운 노드로 변경


    #tail로 삽입. v : 데이터
    def insertNodeAfter(self, v):
        #없을 경우
        if self.tail is None:
            self.tail = self.Node(v)
            self.head = self.tail #같은 노드를 가리킴
        else:
            #self.tail : 기존노드, self.tail.next : 기존 노드의 next
            self.tail.next = self.Node(v,p=self.tail) #1,2번을 동시수행
            #self.tail.next : 기존노드의 next == 새로운 노드
            self.tail = self.tail.next #3. tail를 새로운 노드로 변경

##테스트
if __name__=="__main__":
    dl = DLinkedList()
    dl.insertNodeBefore('1st')  # head삽입 테스트
    dl.insertNodeBefore('2nd')  # head삽입 테스트
    dl.insertNodeBefore('3rd')  # head삽입 테스트
    dl.insertNodeAfter('B1st') # tail삽입 테스트
    dl.insertNodeAfter('B2nd') # tail삽입 테스트
    dl.insertNodeAfter('B3rd') # tail삽입 테스트

 

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

Comments