파이썬/자료구조와 알고리즘

원형 연결 리스트 복습

sck07013 2024. 9. 8. 17:21

원형 선형 리스트의 개념

 

단순 연결 리스트와 비슷

원형 연결 리스트의 마지막 노드가 다시 첫 번째 노드를 가르키도록 설정되어 리스트 형태가 원 형태로 구성

 

단순 연결 리스트의 구조

#노드 생성
class Node() :               #노드 데이터 만들기
    def __init__ (self) :    #데이터를 생성할 때 자동으로 생성되는 부분
        self.data = None
        self.link - None

node1 = Node()
node.data = '다현'

node1.link = node1           #원형

 

#노드 연결
class Node() :               #노드 데이터 만들기
    def __init__ (self) :    #데이터를 생성할 때 자동으로 생성되는 부분
        self.data = None
        self.link - None

node1 = Node()
node.data = '다현'

node1.link = node1

node2 = Node()
node2.data = '정연'
node1.link = node2
node2.link = node1

 

데이터가 5개인 원형 선형 리스트
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 = ' ')
다현 정연 쯔위 사나 지효

 

#노드 삽입 ('다현', '정연', '쯔위', '사나', '지효') 정연과 쯔위 사이
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 = ' ')
다현 정연 재남 쯔위 사나 지효

 

#노드 삭제 ('다현', '정연', '쯔위', '사나', '지효') 중에서 쯔위 삭제
             #1      #2     #3      #4      #5

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 = ' ')
다현 정연 사나 지효

 

#원현 연결 리스트 일반 구현(첫 번째 데이터)
node = Node()               #빈 노드 생성
node.data = dataArray[0]    #첫 번째 노드
head = node                 #첫 번째 노드를 헤드로 지정
node.link = head            #새 노드의 링크를 헤드가 가르키는 노드로 지정
memory.append(node)         #노드를 메모리에 넣음

 

#원형 연결 리스트 일반 구현(두 번째 이후 데이터)
pre = node             #기존 노드를 임시 저장
node = Node()          #빈 노드 생성
node.data = data       #데이터 입력
pre.link = node        #이전 노드의 링크를 새 노드에 대입
node.link = head       #새 노드의 링크에 헤드가 가리키는 노드 연결
memory.append(node)    #노드를 메모리에 넣음

 

##원형 연결 리스트 생성##

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

def printNodes(start):
    current = start
    if current == None:
        return
    print(current.data, end =' ')
    while current.link != start:
        current = current.link
        print(current.data, end =' ')
    print()
##전역 변수 선언 부분##
memory = []
head, current, pre = None, None, None
dataArray = ['다현', '정연', '쯔위', '사나', '지효']

##메인 코드 부분##
if __name__ == "__main__" :
    
    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)
다현 정연 쯔위 사나 지효

 

#원형 연결 리스트에 첫 번째 노드 삽입 과정
node = Node()             #새 노드 생성
node.data = '화사'  
node.link = head          #새 노드의 해드가 가르키는 노드를 지정
last = head               #마지막 노드를 첫 번째 노드로 우선 지정
while 마지막 노드까지 :    #마지막 노드를 찾으면 반복 종료
    last = last.link      #last를 다음 노드로 변경
last.link = node          #마지막 노드의 링크에 새 노드 지정
head = node

 

#중간 노드 삽입 과정
current = head
while 마지막 노드까지 :
    pre = current
    current = current.link
    if current.data == '사나' :
        node = Node()
        node.data = '솔라'
        node.link = current
        pre.link = node

 

#마지막 노드 삽입
current = head
while 마지막 노드까지 :
    pre = current
    current = current.link
    if current.data != '사나' :
        node = Node()
        node.data = '문별'
        current.link = node
        node.link = head

 

#노드 삽입 함수 

#클래스와 선언 부분
class Node() :
    def __init__(self) :
        self.data = None
        self.link = None
    
def printNodes(start) :
    current = start
    if current.link == None :
        return
    print(current.data, end = ' ')
    while current.link != start :
        current = current.link
        print(current.data, end = ' ')
    print()

def insertNode(findData, insertData) :
    global memory, head, current, pre

    if head.data == findData :            #첫 번째 노드 삽입
        node = Node()      
        node.data = insertData
        node.link = head
        last = head                       #마지막 노드를 첫 번째 노드로 우선 지정
        while last.link != head :         #마지막 노드를 찾으면 반복 종료
            last = last.link              #last를 다음 노드로 지정
        last.link = node                  #마지막 노드의 링크에 새 노드 지정
        head = node
        return

    current = head
    while current.link != head :
        pre = current
        current = current.link
        if current.data == findData :
            node = Node()
            node.data = insertData
            node.link = current
            pre.link = node
            return

    node= Node()
    node.data = insertData
    current.link = node
    node.link = head

current = head
head = head.link
last = head
while last.link = current :
    last = last.link
last.link = head
del(current)
##메인 코드 부분
if __name__ == "__main__" :
    
    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)

    insertNode('다현', '화사')
    printNodes(head)

    insertNode('사나', '솔라')
    printNodes(head)

    insertNode('재남', '문별')
    printNodes(head)
다현 정연 쯔위 사나 지효 
화사 다현 정연 쯔위 사나 지효 
화사 다현 정연 쯔위 솔라 사나 지효 
화사 다현 정연 쯔위 솔라 사나 지효 문별

 

#첫 번째 노드 삭제
current = head
head = head.link
last = head
while last.link = current :
    last = last.link
last.link = head
del(current)

 

#첫 번째 외 노드 삭제
current = head
while current.link != head :
    pre = current
    current = current.link
    if currentData == '쯔위' :
        pre.link = current.link 
        del(current)

 

#노드 삭제 함수

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

def printNodes(start) :
    current = start
    if current.link == None :
        return
    print(current.data, end = ' ')
    while current.link != start :
        current = current.link
        print(current.data, end = ' ')
    print()

def deleteNode(deleteData) :
    global memory, head, current, pre

    if head.data == deleteData :
        current = head
        head = head.link
        last = head
        while last.link != current :
            last = last.link
        last.link = head
        del(current)
        return

    current = head
    while current.link != head :
        pre = current
        current = current.link
        if current.data == deleteData :
            pre.link = current.link
            del(current)
            return

##전역 변수 선언 부분##
memory = []
head, current, pre = None, None, None
dataArray = ['다현', '정연', '쯔위', '사나', '지효']

##메인 코드 부분
if __name__ == "__main__" :
    
    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)

    deleteNode('다현')
    printNodes(head)

    deleteNode('쯔위')
    printNodes(head)

    deleteNode('지효')
    printNodes(head)

    deleteNode('재남')
    printNodes(head)
다현 정연 쯔위 사나 지효 
정연 쯔위 사나 지효 
정연 사나 지효 
정연 사나 
정연 사나

 

#원형 연결 리스트 노드 검색 함수
#클래스와 함수 선언 부분
class Node() :
    def __init__ (self) :
        self.data = None
        self.link = None

def findNode(findData) :
    current = head
    if current.data == findData :
        return
    while current.link != head :
        current = current.link
        if current.data == findData :
            return current
    return Node

##전역 변수 선언 부분##
memory = []
head, current, pre = None, None, None
dataArray = ['다현', '정연', '쯔위', '사나', '지효']

#메인 코드 부분#
if __name__ == "__main__" :

    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)

    fNode = findNode('다현')
    print(fNode.data)

    fNode = findNode('쯔위')
    print(fNode.data)

    fNode = findNode('재남')
    print(fNode.data)