← 목차로 돌아가기 / Back to Index

🧪 Ch05. 원형/이중 연결 리스트 — 실습 코드 / Lab Code: Circular / Doubly Linked Lists

자료구조와 알고리즘 실습 | Data Structures & Algorithms Lab

💡 학습 팁: 코드를 직접 타이핑하면서 익히세요! 숨겨진 코드는 버튼을 눌러 확인하기 전에 먼저 스스로 생각해 보세요.
💡 Study Tip: Type the code yourself to learn! Try to think about hidden sections before revealing them.

📘 교재 예제 (Code)

📘 Textbook Examples (Code)

Code05-01.py

원형 연결 리스트의 노드를 생성합니다

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

node4 = Node()
node4.data = "사나"
node3.link = node4
node4.link = node1

node5 = Node()
node5.data = "지효"
node4.link = node5
node5.link = node1

current = node1
print(current.data, end =' ')
while current.link != node1 :
	current = current.link
	print(current.data, end=' ')
Code05-01.py

Creates nodes for a circular linked list

class Node() :
	def __init__ (self) :
		self.data = None
		self.link = None

node1 = Node()
node1.data = "Dahyun"
node1.link = node1

node2 = Node()
node2.data = "Jungyeon"
node1.link = node2
node2.link = node1

node3 = Node()
node3.data = "Tzuyu"
node2.link = node3
node3.link = node1

node4 = Node()
node4.data = "Sana"
node3.link = node4
node4.link = node1

node5 = Node()
node5.data = "Jihyo"
node4.link = node5
node5.link = node1

current = node1
print(current.data, end =' ')
while current.link != node1 :
	current = current.link
	print(current.data, end=' ')
Code05-02.py

원형 연결 리스트에서 노드를 삽입합니다

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

node4 = Node()
node4.data = "사나"
node3.link = node4
node4.link = node1

node5 = Node()
node5.data = "지효"
node4.link = node5
node5.link = node1

newNode = Node()
newNode.data = "재남"
newNode.link = node2.link   # 정연 노드의 링크
node2.link = newNode

current = node1
print(current.data, end = ' ')
while current.link != node1 :
	current = current.link
	print(current.data, end = ' ')
Code05-02.py

Inserts nodes into a circular linked list

class Node() :
	def __init__ (self) :
		self.data = None
		self.link = None

node1 = Node()
node1.data = "Dahyun"
node1.link = node1

node2 = Node()
node2.data = "Jungyeon"
node1.link = node2
node2.link = node1

node3 = Node()
node3.data = "Tzuyu"
node2.link = node3
node3.link = node1

node4 = Node()
node4.data = "Sana"
node3.link = node4
node4.link = node1

node5 = Node()
node5.data = "Jihyo"
node4.link = node5
node5.link = node1

newNode = Node()
newNode.data = "Jaenam"
newNode.link = node2.link   # Jungyeon node's link
node2.link = newNode

current = node1
print(current.data, end = ' ')
while current.link != node1 :
	current = current.link
	print(current.data, end = ' ')
Code05-03.py

원형 연결 리스트에서 노드를 삭제합니다

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

node4 = Node()
node4.data = "사나"
node3.link = node4
node4.link = node1

node5 = Node()
node5.data = "지효"
node4.link = node5
node5.link = node1

node2.link = node3.link
del(node3)

current = node1
print(current.data, end = ' ')
while current.link != node1 :
	current = current.link
	print(current.data, end = ' ')
Code05-03.py

Deletes nodes from a circular linked list

class Node() :
	def __init__ (self) :
		self.data = None
		self.link = None

node1 = Node()
node1.data = "Dahyun"
node1.link = node1

node2 = Node()
node2.data = "Jungyeon"
node1.link = node2
node2.link = node1

node3 = Node()
node3.data = "Tzuyu"
node2.link = node3
node3.link = node1

node4 = Node()
node4.data = "Sana"
node3.link = node4
node4.link = node1

node5 = Node()
node5.data = "Jihyo"
node4.link = node5
node5.link = node1

node2.link = node3.link
del(node3)

current = node1
print(current.data, end = ' ')
while current.link != node1 :
	current = current.link
	print(current.data, end = ' ')
Code05-04.py

원형 연결 리스트의 삽입/삭제 통합 프로그램입니다

## 클래스와 함수 선언 부분 ##
class Node() :
	def __init__ (self) :
		self.data = None
		self.link = None

def printNodes(start) :
## 전역 변수 선언 부분 ##
memory = []
head, current, pre = None, None, None
dataArray = ["다현", "정연", "쯔위", "사나", "지효"]

## 메인 코드 부분 ##
Code05-04.py

Complete circular linked list with insert and delete

## Class & Function Declarations ##
class Node() :
	def __init__ (self) :
		self.data = None
		self.link = None

def printNodes(start) :
## Global Variables ##
memory = []
head, current, pre = None, None, None
dataArray = ["Dahyun", "Jungyeon", "Tzuyu", "Sana", "Jihyo"]

## Main Code ##
if __name__ == "__main__" :

	node = Node()		
	node.data = dataArray[0]	# First node
	head = node
	node.link = head
	memory.append(node)

	for data in dataArray[1:] :	# From the second node onward
		pre = node
		node = Node()
		node.data = data
		pre.link = node
		node.link = head
		memory.append(node)

	printNodes(head)
Code05-05.py

이중 연결 리스트의 노드를 생성하고 연결합니다

## 클래스와 함수 선언 부분 ##
class Node() :
    def __init__ (self) :
        self.data = None
        self.link = None

def printNodes(start):
def insertNode(findData, insertData) :
## 전역 변수 선언 부분 ##
memory = []
head, current, pre = None, None, None
dataArray = ["다현", "정연", "쯔위", "사나", "지효"]

## 메인 코드 부분 ##
Code05-05.py

Creates and connects nodes of a doubly linked list

## Class & Function Declarations ##
class Node() :
    def __init__ (self) :
        self.data = None
        self.link = None

def printNodes(start):
def insertNode(findData, insertData) :
## Global Variables ##
memory = []
head, current, pre = None, None, None
dataArray = ["Dahyun", "Jungyeon", "Tzuyu", "Sana", "Jihyo"]

## Main Code ##
if __name__ == "__main__" :

	node = Node()
	node.data = dataArray[0]	# First node
	head = node
	node.link = head
	memory.append(node)

	for data in dataArray[1:] :	# From the second node onward
		pre = node
		node = Node()
		node.data = data
		pre.link = node
		node.link = head
		memory.append(node)

	printNodes(head)

	insertNode("Dahyun", "Hwasa")
	printNodes(head)

	insertNode("Sana", "Solar")
	printNodes(head)

	insertNode("Jaenam", "Moonbyul")
	printNodes(head)
Code05-06.py

이중 연결 리스트에 노드를 삽입합니다

## 클래스와 함수 선언 부분 ##
class Node() :
	def __init__ (self) :
		self.data = None
		self.link = None

def printNodes(start):
def deleteNode(deleteData) :
## 전역 변수 선언 부분 ##
memory = []
head, current, pre = None, None, None
dataArray = ["다현", "정연", "쯔위", "사나", "지효"]

## 메인 코드 부분 ##
Code05-06.py

Inserts nodes into a doubly linked list

## Class & Function Declarations ##
class Node() :
	def __init__ (self) :
		self.data = None
		self.link = None

def printNodes(start):
def deleteNode(deleteData) :
## Global Variables ##
memory = []
head, current, pre = None, None, None
dataArray = ["Dahyun", "Jungyeon", "Tzuyu", "Sana", "Jihyo"]

## Main Code ##
if __name__ == "__main__" :

	node = Node()		# First node
	node.data = dataArray[0]
	head = node
	node.link = head
	memory.append(node)

	for data in dataArray[1:] :	# From the second node onward
		pre = node
		node = Node()
		node.data = data
		pre.link = node
		node.link = head
		memory.append(node)

	printNodes(head)

	deleteNode("Dahyun")
	printNodes(head)

	deleteNode("Tzuyu")
	printNodes(head)

	deleteNode("Jihyo")
	printNodes(head)

	deleteNode("Jaenam")
	printNodes(head)
Code05-07.py

이중 연결 리스트에서 노드를 삭제합니다

## 클래스와 함수 선언 부분 ##
class Node() :
    def __init__ (self) :
        self.data = None
        self.link = None

def printNodes(start):
def findNode(findData) :
## 전역 변수 선언 부분 ##
memory = []
head, current, pre = None, None, None
dataArray = ["다현", "정연", "쯔위", "사나", "지효"]

## 메인 코드 부분 ##
Code05-07.py

Deletes nodes from a doubly linked list

## Class & Function Declarations ##
class Node() :
    def __init__ (self) :
        self.data = None
        self.link = None

def printNodes(start):
def findNode(findData) :
## Global Variables ##
memory = []
head, current, pre = None, None, None
dataArray = ["Dahyun", "Jungyeon", "Tzuyu", "Sana", "Jihyo"]

## Main Code ##
if __name__ == "__main__" :

	node = Node()		# First node
	node.data = dataArray[0]
	head = node
	node.link = head
	memory.append(node)

	for data in dataArray[1:] :	# From the second node onward
		pre = node
		node = Node()
		node.data = data
		pre.link = node
		node.link = head
		memory.append(node)

	printNodes(head)

	fNode = findNode("Dahyun")
	print(fNode.data)

	fNode = findNode("Tzuyu")
	print(fNode.data)

	fNode = findNode("Jaenam")
	print(fNode.data)
Code05-08.py

랜덤 데이터로 이중 연결 리스트를 생성합니다

import random

## 클래스와 함수 선언 부분 ##
class Node() :
	def __init__ (self) :
		self.data = None
		self.link = None

def printNodes(start):
def  countOddEven() :
def makeZeroNumber(odd, even):
## 전역 변수 선언 부분 ##
memory = []
head, current, pre = None, None, None

## 메인 코드 부분 ##
Code05-08.py

Creates a doubly linked list with random data

import random

## Class & Function Declarations ##
class Node() :
	def __init__ (self) :
		self.data = None
		self.link = None

def printNodes(start):
def  countOddEven() :
def makeZeroNumber(odd, even):
## Global Variables ##
memory = []
head, current, pre = None, None, None

## Main Code ##
if __name__ == "__main__" :

	dataArray = []
	for _ in range(7) :
		dataArray.append(random.randint(1, 100))

	node = Node()
	node.data = dataArray[0]
	head = node
	node.link = head
	memory.append(node)

	for data in dataArray[1:] :
		pre = node
		node = Node()
		node.data = data
		pre.link = node
		node.link = head
		memory.append(node)

	printNodes(head)

	oddCount, evenCount = countOddEven()
	print('odd -->', oddCount, '\t', 'even -->', evenCount)

	makeZeroNumber(oddCount, evenCount)
	printNodes(head)

📗 응용 예제 (Ex)

📗 Applied Examples (Ex)

EX05-01.py

원형 연결 리스트 응용: 랜덤 데이터 정렬 삽입

import random
import math

## 클래스와 함수 선언 부분 ##
class Node() :
	def __init__ (self) :
		self.data = None
		self.link = None

def printStores(start) :
def  makeStoreList(store) :
## 전역 변수 선언 부분 ##
memory = []
head, current, pre = None, None, None

## 메인 코드 부분 ##
EX05-01.py

Circular linked list application: sorted insertion of random data

import random
import math

## Class & Function Declarations ##
class Node() :
	def __init__ (self) :
		self.data = None
		self.link = None

def printStores(start) :
def  makeStoreList(store) :
## Global Variables ##
memory = []
head, current, pre = None, None, None

## Main Code ##
if __name__ == "__main__" :

	storeArray = []
	storeName = 'A'
	for _ in range(10) :
		store = (storeName, random.randint(1, 100), random.randint(1, 100) )
		storeArray.append(store)
		storeName = chr(ord(storeName) + 1)	# Change store name A->B->C...

	for store in storeArray :
		makeStoreList(store)

	printStores(head)
Ex05-02.py

이중 연결 리스트 응용: 양방향 순회

## 클래스와 함수 선언 부분 ##
class Node2() :
	def __init__ (self) :
		self.plink = None		# 앞쪽 링크
		self.data = None
		self.nlink = None		# 뒤쪽 링크

def printNodes(start):
## 전역 변수 선언 부분 ##
memory = []
head, current, pre = None, None, None
dataArray = ["다현", "정연", "쯔위", "사나", "지효"]

## 메인 코드 부분 ##
Ex05-02.py

Doubly linked list application: bidirectional traversal

## Class & Function Declarations ##
class Node2() :
	def __init__ (self) :
		self.plink = None		# previous link
		self.data = None
		self.nlink = None		# next link

def printNodes(start):
## Global Variables ##
memory = []
head, current, pre = None, None, None
dataArray = ["Dahyun", "Jungyeon", "Tzuyu", "Sana", "Jihyo"]

## Main Code ##
if __name__ == "__main__" :

	node = Node2()			# First node
	node.data = dataArray[0]
	head = node
	memory.append(node)

	for data in dataArray[1:] :		# From the second node onward
		pre = node
		node = Node2()
		node.data = data
		pre.nlink = node
		node.plink = pre
		memory.append(node)

	printNodes(head)

📙 자가 실습 (Self)

📙 Self Practice (Self)

Self05-01.py

원형 연결 리스트를 직접 구현합니다

## 클래스 및 함수 선언부 ##
class Node() :
    def __init__ (self) :
        self.data = None
        self.link = None

def printNodes(start):
def findNode(findData) :
## 전역 변수 선언부
memory = []
head, current, pre = None, None, None
dataArray = ["다현", "정연", "쯔위", "사나", "지효"]

## 메인 코드부
Self05-01.py

Implements a circular linked list yourself

## Class & Function Declarations ##
class Node() :
    def __init__ (self) :
        self.data = None
        self.link = None

def printNodes(start):
def findNode(findData) :
## Global Variables
memory = []
head, current, pre = None, None, None
dataArray = ["Dahyun", "Jungyeon", "Tzuyu", "Sana", "Jihyo"]

## Main Code
if __name__ == "__main__" :

    # First node
    node = Node()
    node.data = dataArray[0]
    head = node
    node.link = head
    memory.append(node)

    # From the second node onward
    for data in dataArray[1:] :
        pre = node
        node = Node()
        node.data = data
        pre.link = node
        node.link = head
        memory.append(node)

    printNodes(head)

    fNode = findNode("Dahyun")
    print(fNode.data)

    fNode = findNode("Tzuyu")
    print(fNode.data)

    fNode = findNode("Jaenam")
    print(fNode.data)
Self05-02.py

이중 연결 리스트를 직접 구현합니다

import random

## 클래스 및 함수 선언부 ##
class Node() :
    def __init__ (self) :
        self.data = None
        self.link = None

def printNodes(start) :
def  countOddEven() :
def makeZeroNumber(odd, even):
## 전역 변수 선언부
memory = []
head, current, pre = None, None, None

## 메인 코드부
Self05-02.py

Implements a doubly linked list yourself

import random

## Class & Function Declarations ##
class Node() :
    def __init__ (self) :
        self.data = None
        self.link = None

def printNodes(start) :
def  countOddEven() :
def makeZeroNumber(odd, even):
## Global Variables
memory = []
head, current, pre = None, None, None

## Main Code
if __name__ == "__main__" :

    dataArray = []
    for _ in range(7) :
        dataArray.append(random.randint(-100,100))

    node = Node()
    node.data = dataArray[0]
    head = node
    node.link = head
    memory.append(node)

    for data in dataArray[1:] :
        pre = node
        node = Node()
        node.data = data
        pre.link = node
        node.link = head
        memory.append(node)

    printNodes(head)

    plusCount, minusCount = countOddEven()
    print('positive -->', plusCount, '\t', 'negative -->', minusCount)

    makeZeroNumber(plusCount, minusCount)
    printNodes(head)