nathan_H
양방향 연결리스트(Double LinkedList) 본문
Double LinkedList
reference
어서와! 자료구조와 알고리즘은 처음이지? | 프로그래머스

앞서 살펴본 단뱡향 연결리스트와 달리 이번에는 양방향 연결리스트로 링크가 한쪽방향이 아닌 양방형으로 연결된 Double LinkedList에 대해서 살펴볼려고 한다.
말 그대로, 양방향 연결 리스트에서는 노드들이 앞/뒤로 연결되어 있습니다. 즉, 인접한 두 개의 노드들은 앞의 노드로부터 뒤의 노드가 연결되어 있을뿐만 아니라, 뒤의 노드로부터 앞의 노드도 연결되어 있습니다. 한 노드의 입장에서 보자면, 자신보다 앞에 오는 노드를 연결하는 링크와 자신보다 뒤에 오는 노드를 연결하는 링크를 둘 다 가진다.
또한 양방향 연결리스트는 기존 단방향 연결리스트와 달리 HEAD, TAIL노드에 Dummy인 빈 노드가 초기화 되어 있는 연결리스트이다.
장단점
단점
- 메모리 사용량 증가.
- 원소 삽입 / 삭제하는 연산 코드량 증가.(앞 / 뒤 링크 조절 필요)
장점
-
원소 방문 용이(앞/뒤로 접근 가능)
→ 실제로 (제 7 강에서 언급한 바와 같이) 컴퓨터 시스템의 주요 구성 요소의 하나인 운영체제 (operating system) 등에서는 리스트를 대상으로 앞/뒤로 왔다 갔다 하면서 작업을 행하는 일들이 빈번히 요구되고, 따라서 양방향 연결 리스트가 많이 이용도고 있다.
Methods
1. getLength() 2. traversal()
3. getAt() 4. insertAfter(prev)
5. insertAt(pos, newNode) 6. insertBefore(next, newNode)
7. popAfter(prev) 8. popAt(pos)
9. popBefore(next) 10. cancat(L) 11. reverse()
코드 구현
https://github.com/NDjust/python_data_structure/blob/master/DoublyLinkedList/DoublyLinkedList.py
class Node: ''' extends self.prev variable at LinkedList ''' def __init__(self, item): self.data = item self.prev = None self.next = None class DoublyLinkedList: ''' extends reverse, before methods at LinkedList extends member variable at LinkedList ''' def __init__(self): self.nodeCount = 0 self.head = Node(None) self.tail = Node(None) self.head.prev = None self.head.next = self.tail self.tail.prev = self.head self.tail.next = None def __repr__(self): if self.nodeCount == 0: return 'LinkedList: empty' s = '' curr = self.head while curr.next.next: curr = curr.next s += repr(curr.data) if curr.next.next is not None: s += ' -> ' return s def getLength(self): return self.nodeCount def traverse(self): result = [] curr = self.head while curr.next.next: curr = curr.next result.append(curr.data) return result def reverse(self): result = [] curr = self.tail while curr.prev.prev: curr = curr.prev result += [curr.data] return result def getAt(self, pos): if pos < 0 or pos > self.nodeCount: return None if pos > self.nodeCount // 2: i = 0 curr = self.tail while i < self.nodeCount - pos + 1: curr = curr.prev i += 1 else: i = 0 curr = self.head while i < pos: curr = curr.next i += 1 return curr def insertAfter(self, prev, newNode): next = prev.next newNode.prev = prev newNode.next = next prev.next = newNode next.prev = newNode self.nodeCount += 1 return True def insertAt(self, pos, newNode): if pos < 1 or pos > self.nodeCount + 1: return False prev = self.getAt(pos - 1) return self.insertAfter(prev, newNode) def insertBefore(self, next, newNode): prev = next.prev newNode.next = prev.next newNode.prev = prev prev.next = newNode next.prev = newNode self.nodeCount -= 1 return True def popAfter(self, prev): curr = prev.next prev.next = curr.next curr.next.prev = prev self.nodeCount -= 1 return curr.data def popBefore(self, next): curr = next.prev prev = curr.prev prev.next = next next.prev = prev self.nodeCount -= 1 return curr.data def popAt(self, pos): if pos < 1 or pos > self.nodeCount: raise IndexError prev = self.getAt(pos - 1) return self.popAfter(prev) def concat(self, L): self.tail.prev.next = L.head.next L.head.next.prev = self.tail.prev self.tail = L.tail self.nodeCount += L.nodeCount
'Computer Science > DataStructure' 카테고리의 다른 글
[자료구조] Queue 의 특징 및 활용예제 (0) | 2019.07.09 |
---|---|
[Stack] python으로 구현한 자료구조 stack (1) | 2019.07.06 |
연결리스트의 특징과 파이썬 코드 구현 (0) | 2019.07.02 |