양방향 연결 리스트 (Doubly Linked Lists)
한 쪽으로만 링크를 연결하지 말고, 양쪽으로!
-> 앞으로도 (다음 node) 뒤로도 (이전 node) 진행 가능
Node의 구조 확장
class Node:
def __init__(self, item):
self.data = item
self.prev = None
self.next = None
리스트 처음과 끝에 dummy node를 두자!
-> 데이터를 담고 있는 node들은 모두 같은 모양
class DoublyLinkedList:
def __init__(self, item):
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 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.append(curr.data)
return result
원소의 삽입
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 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 insertAt(self, pos, newNode):
if pos < 1 or pos > self.nodeCount + 1:
return False
prev = self.getAt(pos - 1)
return self.insertAfter(prev, newNode)
실습 과제1,2,3,4 - GitHub에서 확인
과제1. 양방향 연결 리스트 역방향 순회 (reverse 구현)
과제2. 양방향 연결 리스트 노드 삽입 (insertBefore() 구현)
과제3. 양방향 연결 리스트 노드 삭제 (popAfter(), popBefore(), popAt() 구현)
과제4. 양방향 연결 리스트의 병합 (concat 구현)
https://github.com/hanna56/Algorithm-lecture/tree/main
* 프로그래머스의 '어서와! 자료구조와 알고리즘은 처음이지?' 강의를 듣고 정리하였습니다.
'알고리즘 강의' 카테고리의 다른 글
[알고리즘 강의] 파트12. 스택의 응용: 수식의 후위 표기법 (0) | 2021.07.16 |
---|---|
[알고리즘 강의] 파트11. 스택(Stacks) (0) | 2021.07.16 |
[알고리즘 강의] 파트9. 연결 리스트(Linked Lists) (3) (0) | 2021.07.15 |
[알고리즘 강의] 파트8. 연결 리스트(Linked Lists) (2) (0) | 2021.07.14 |
[알고리즘 강의] 파트7. 연결 리스트(Linked Lists) (1) (0) | 2021.07.14 |