
🧩 원형연결리스트(CircularLinkedList)
- 단순연결리스트의 마지막과 끝이 서로 연결 → 원을 이루고 있는 리스트
- 마지막노드 ~ 첫노드 접근 → O(n)에서 O(1)로 단축됨
소프트웨어에서 원형연결리스트가 쓰이는경우
📎 CPU 클럭


📍 Node 데이터형정의를 위한 class 생성
>>> class Node():
def __init__(self): # 생성자
self.data = None # 데이터공간
self.link = None # 링크공간
📍 첫번째노드
>>> node1 = Node()
>>> node1.data = "서울"
>>> node1.link = node1
📍 두번째노드
>>> node2 = Node()
>>> node2.data = "대구"
📍 첫번째 두번째노드 연결
>>> node1.link = node2
>>> node2.link = node1
📍 세번째노드
>>> node3 = Node()
>>> node3.data = "부산"
📍 노드 최종연결
>>> node2.link = node3
>>> node3.link = node1
📍 노드순회
>>> current = node1
>>> print(current.data, end = '')
>>> while current.link != node1:
current = current.link
print(current.data, end = '')
📍 새노드생성
>>> newNode = Node()
>>> newNode.link = head # 링크우선연결
>>> newNode.data = "파주"
📍 Head 새노드로 지정하기
>>> last = head # 마지막노드를 첫번째노드로 우선지정 (서울)
>>> while last.link != head: # 마지막노드까지 반복
last = last.link # 한칸씩 이동
>>> last.link = newNode # 마지막노드링크 -> 새노드지정
>>> head = newNode
📍 출력하기
>>> current = head
>>> print(current.data, end = '')
>>> while current.link != head:
current = current.link
print(current.data, end = '')
# 파주 서울 대구 부산
Current Pre 이동Pre노드 링크 → 새로운 노드를 가리키게 함Current 가리키게 함
📍 데이터삽입(중간)
>>> current = head
>>> while current.link != head:
pre = current
current = current.link
if current.data = "부산":
node = Node() # 새로운노드생성
node.data = "포항"
# 연결하기
node.link = current
pre.link = current
📍 출력하기
>>> current = head
>>> print(current.data, end = '')
>>> while current.link != head:
current = current.link
print(current.data, end = '')
# 파주, 서울, 대구, 포항, 부산
📍 데이터삽입(마지막)
# current 마지막노드로 지정
>>> current = head
>>> while current.link != head:
current = current.link
>>> newNode = Node()
>>> newNode.data = "제주"
>>> current.link = newNode
>>> newNode.link = head
📍 출력하기
>>> current = head
>>> print(current.data, end = '')
>>> while current.link != head:
current = current.link
print(current.data, end='')
# 파주 서울 대구 포항 부산 제주
📍 데이터삭제(첫번째)
>>> current = head
>>> head = head.link
>>> last = head
>>> while last.link != current:
last = last.link
>>> last.link = head
>>> del(current)
📍 출력하기
>>> current = head
>>> print(current.data, end = '')
>>> while current.link != head:
current = current.link
print(current.data, end= '')
# 서울 대구 포항 부산 제주
📍 데이터삭제(첫번째노드외)
>>> current = head
>>> while current.link != head:
pre = current
current = current.link
if current.data = "대구":
pre.link = current.link
del(current)
📍 출력하기
>>> current = head
>>> print(current.data, end='')
>>> while current.link != head:
current = current.link
print(current.data, end = '')
# 서울 포항 부산 제주
📍 노드검색
>>> current = head
>>> if current.data == "부산":
print(current.data)
>>> while current.link != head:
current = current.link
if current.data == "부산":
print(current.data)
# 부산
| 항목 | 조회 | 삽입 | 삭제 |
|---|---|---|---|
| 선형리스트 | O(1) | O(n) | O(n) |
| 단순연결리스트 | O(n) | O(1) | O(1) |
| 원형연결리스트 | O(n) | O(1) | O(1) |