PS

연결리스트 구현(python)

mky 2025. 8. 16. 15:48

파이썬으로 연결리스트를 구현해보았다

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

# 대원칙 : 삽입위치의 뒤를 먼저 연결하고, 그다음 삽입위치의 앞을 연결한다.
# 연결 리스트 클래스 만들기
class LinkedList:
    def __init__(self):
        self.head = None #공백 리스트 생성
        self.length = 0

    def __len__(self): # 길이 계산 메서드
        return self.length
    
    def appendleft(self, data): #왼쪽에다 노드삽입
        if self.head is None: #공백일 경우
            self.head = Node(data) #헤드 포인터가 새 노드를 가리킨다
        else:
            new = Node(data) # 삽입할 노드 생성하고 뉴 포인터가 가리키게 함
            new.next = self.head # 새노드의 링크필드에 기존 첫번째 노드 주소 설정
            self.head = new # 헤드 포인터가 새 노드를 가리키도록 함
        self.length += 1 # 길이 증가

    def append(self, data): #오른쪽에다 노드삽입
        if self.head is None: #공백일 경우
            self.head = Node(data)  
        else:
            temp = self.head  #temp는 탐색하는 포인터 역할, 첫 노드를 가리키게 초기화
            while temp.next is not None: # 끝에 갈때까지
                temp = temp.next #다음 노드로 이동
            temp.next = Node(data) #노드 삽입
        self.length += 1 #길이 증가

    def __str__(self): #연결 리스트 상태 출력하기
        if self.head is None:
            return "Linked list is empty!"
        res = "Head"
        temp = self.head
        while temp is not None:
            res += " -> " + str(temp.data)
            temp = temp.next
        return res

    def __contains__(self, target): # 값이 포함되어있는지 확인하는 메서드
        if self.head is None: #공백일 경우
            return False
        temp = self.head 
        while temp is not None:
            if temp.data == target:
                return True
            temp = temp.next
        return False
    
    def remove(self, target): # 특정 노드 삭제
        temp = self.head
        while temp is not None and temp.data != target: # 리스트의 끝까지 이동하지 않았고 탐색한 데이터가 타겟과 다른 경우
            prev = temp
            temp = temp.next
        if temp is None: #끝까지 탐색했는데 해당노드가 없을 경우
            return False
        if temp == self.head: #삭제할 노드가 head인 경우
            self.head = self.head.next
        else:
            prev.next = temp.next #건뛰
        self.length -= 1
        return True
    
    def insert(self, i, data): #특정 위치(i)에 데이터를 삽입
        #인덱스 오버 대비
        if i <= 0:
            self.appendleft(data)
        elif i >= self.length:
            self.append(data)
        else:
            temp = self.head
            for _ in range(i-1): #삽입위치 전까지 이동
                temp = temp.next 
            new_node = Node(data) 
            new_node.next = temp.next #뒤를 연결하고
            temp.next = new_node #앞을 연결한다
        self.length += 1

    def reverse(self): #연결리스트 뒤집기
        if self.length < 2:
            return
        p = self.head
        q = None # 추후 뒤집힌 리스트의 헤드 
        r = None

        # 리스트의 첫 번째 노드부터 링크를 따라 다음 노드로 이동하면서 노드 간의 연결을 바꿈
        while p is not None:
            r = q
            q = p
            p = p.next
            q.next = r
        self.head = q


if __name__ == "__main__":
    import random
    data = list(range(10, 15))
    random.shuffle(data)
    my_list = LinkedList()
    for i in data:
        my_list.append(i)
    print(f"연결 리스트의 상태\n연결 리스트의 길이 =  {len(my_list)},  {my_list}")
    print()
    for _ in range(10):
        i = random.randint(10, 15)
        if my_list.remove(i):
            print(f"{i}를 연결 리스트에서 삭제했습니다.")
            print(f"연결 리스트의 길이 = {len(my_list)},  {my_list}\n")
        else:
            print(f"{i}는 연결 리스트에 없습니다.\n")

연결리스트 뒤집기는 학교 자료구조 시간에 c언어로 구현해보았던 걸 파이썬으로 다시 구현하였다.

'PS' 카테고리의 다른 글

큐 구현(python)  (2) 2025.08.16
이중 연결리스트 구현(python)  (1) 2025.08.16