티스토리 뷰
728x90
반응형
연결List에 대해서 포스팅하면서, 단일연결List는 Next Index의 접근은 용이하지만, 이전 Index로 가는것은 어렵다고 했습니다.
이러한 문제점을 개선하기 위해서 고안된 개선된 Connect List중 원형연결 List, 이중연결 List가 있습니다.
1. 원형연결 List
기존 단일연결list의 마지막 Index의 Node는 항상 Next Node가 Null값을 갖게 됩니다.
이때 Data의 여부를 Search할 경우, 지속적으로 "Next Node가 Null인가?" 를 검사하게 됩니다.
하지만 마지막 Index의 Node를 첫번째 Index Node를 Pointing 하게 함 으로써 프로그램의 성능 향상을 도모할 수 있습니다.
파이썬으로 구현된 원형 연결 List입니다.
class node:
def __init__(self,node_value,next_node):
self.value = node_value
self.next = next_node
class cirular_c_list:
def __init__(self):
self.inital_node = node("start",None)
def add(self, element, index= None):
start_node = self.inital_node.next
#마지막 Node일 경우 None이 아니라 inital Node의 Next Node를 Pointing함
if index == None:
while True:
if start_node == None:
temp = node(element, None)
self.inital_node.next = temp
temp.next = self.inital_node.next
break
elif start_node.next == self.inital_node.next:
start_node.next = node(element, self.inital_node.next)
break
else:
start_node = start_node.next
elif index is not None:
for i in range(index-1):
start_node = start_node.next
start_node.next = node(element, start_node.next)
def remove(self, index):
start_node = self.inital_node.next
for i in range(index):
if start_node.next == self.inital_node.next:
return print("index is out of bound")
else:
if i == index-1:
temp = start_node
start_node = start_node.next
else:
start_node = start_node.next
temp.next = start_node.next
def show(self, node=888):
if node == 888:
node = self.inital_node.next
print(node.value)
if node.next == self.inital_node.next:
return print(-1)
else:
self.show(node.next)
test = [9,7,8,1,3,6,8]
test_list = cirular_c_list()
for i in test:
test_list.add(i)
test_list.show()
=>9,7,8,1,3,6,8,-1
test_list.add(100, 1)
test_list.show()
=>9,100,7,8,1,3,6,8,-1
test_list.remove(6)
test_list.show()
=>9,100,7,8,1,3,8,-1
2. 이중연결 List
이중연결 List는 각 Element의 Node를 확장하여,
Next Node 이외에 이전 Last Node를 가르기는 항목은 추가한 연결List입니다.
이렇게되면 어떤 Node에 있던지 이전 Node에 대한 접근이 용이하고, 원형연결List의 장점을 모두 가질 수 있습니다(마지막 Node에서 원형연결List의 개념 추가)
파이썬으로 구현된 이중 연결 List입니다.
#node를 확장해서 last node pointing을 추가
class node:
def __init__(self,last_node,node_value,next_node):
self.last = last_node
self.value = node_value
self.next = next_node
class double_c_list:
def __init__(self):
self.inital_node = node(None,"start",None)
def add(self, element, index= None):
start_node = self.inital_node.next
#inital_node의 next는 index 0, last는 마지막 index를 Pointing
if index == None:
while True:
if start_node == None:
temp = node(start_node,element, self.inital_node)
self.inital_node.next = temp
self.inital_node.last = temp
break
elif start_node.next == self.inital_node:
start_node.next = node(start_node, element, self.inital_node)
break
else:
start_node = start_node.next
elif index is not None:
for i in range(index-1):
start_node = start_node.next
start_node.next = node(start_node,element, start_node.next)
#node를 제거할 때 last를 이용하기 때문에 이전 Node 저장 불필요
def remove(self, index):
start_node = self.inital_node.next
for i in range(index):
if start_node.next == self.inital_node.next:
return print("index is out of bound")
else:
start_node = start_node.next
start_node.last.next = start_node.next
start_node.next.last = start_node.last
def show(self, node=888):
if node == 888:
node = self.inital_node.next
print(node.value)
if node.next == self.inital_node:
return print(-1)
else:
self.show(node.next)
test = [9,6,1,2,7,5,6]
test_list = double_c_list()
for i in test:
test_list.add(i)
test_list.show()
=>9,6,1,2,7,5,6,-1
test_list.add(100, 1)
test_list.show()
=>9,100,6,1,2,7,5,6,-1
test_list.remove(6)
test_list.show()
=>9,100,6,1,2,7,6,-1
728x90
반응형
'Python 자료구조' 카테고리의 다른 글
Heap (0) | 2021.01.30 |
---|---|
Binary Tree (0) | 2021.01.30 |
Connect List(연결리스트) (0) | 2021.01.28 |
Circular Queue (0) | 2021.01.27 |
Queue (0) | 2021.01.26 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- hash
- C++
- 동적계획법
- 분할정복
- git
- 알고리즘
- GDC
- heap
- Sort알고리즘
- 프로그래머스
- 이분탐색
- Greedy알고리즘
- 사칙연산
- prime number
- AVX
- Search알고리즘
- 완전탐색 알고리즘
- SIMD
- 자료구조
- stack
- 병렬처리
- Python
- 코딩테스트
- 컴퓨터그래픽스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함