파이썬과 자료구조(링크드 리스트)

이승혜·2021년 3월 12일
0

📒 링크드 리스트(Linked List)

  • 배열은 순차적으로 연결된 공간에 데이터를 나열하는 데이터 구조

  • 링크드 리스트는 떨어진 곳에 존재하는 데이터를 화살표로 연결해서 관리하는 데이터 구조

  • 파이썬은 리스트 타입이 링크드 리스트의 기능을 모두 지원함

  • 배열은 사전에 데이터 공간을 할당하고 데이터를 순차적으로 저장

  • 링크드 리스트는 사전에 데이터 공간을 미리 할당하지 않아도 됨

    • 데이터가 필요할 때마다, 새로운 공간에 데이터를 만들고 화살표로 연결

✅ 링크드 리스트 구조

  • 하나의 데이터는 해당 데이터와 화살표 정보를 가지는 노드에 저장됨
class Node:
    def __init__(self, data):
        self.data = data
        self.next = ""

def add(data):
    node = head
    # next가 존재하지 않을 때 까지
    while head.next:
        node = head.next
    node.next = Node(data)
head = Node(1)
add(2)


print(head.data) # 1
print(head.next.data) # 2

✅ 링크드 리스트 시간복잡도

  • 삽입 속도
    • 어느 곳에 삽입하던지 O(N)의 시간복잡도를 가짐
    • 만약 중간 삽입이 없다면 O(1)의 시간복잡도를 가짐
    • Why? 삽입할 위치를 찾고(O(N)) 삽입 연산을 진행하기 때문
    • 그럼에도 Array보다 빠른 성능을 보임(linked list는 메모리를 동적으로 할당)
  • 삭제 속도
    • 삭제할 원소를 찾기 위해 O(N)의 시간복잡도를 가짐
    • 그럼에도 Array보다 빠르게 삭제 연산을 수행
  • 접근 속도
    • 순차 접근 방식을 사용하기 때문에, 특정 원소에 접근하기 위해서는 처음부터 원소에 도달할 때 까지 순차적으로 검색하며 찾음(O(N))

삽입과 삭제가 빈번하다면? LinkedList,
데이터 접근이 더 중요하다면? Array

✅ 링크드 리스트 구현

  • 🤔 파이썬으로 링크드 리스트를 아주 간단히 구현해보자
# 노드 클래스 만들기
class Node:
    def __init__(self, data, next=None):
        self.data = data
        self.next = next

# 데이터 생성하기
node1 = Node("seunghye")
node2 = Node("apple")
node3 = Node(1226)
node4 = Node(0.3)

# 데이터 연결하기
node1.next = node2
node2.next = node3
node3.next = node4

# 데이터 출력하기
node = node1
while node:
    print(node.data)
    # 출력 후 다음으로 넘어가기
    node = node.next
  • 📢 출력 결과

  • 🤔 Node를 노드 사이에 추가하고 싶을 때

# 새로운 데이터 생성
node5 = Node("between")

# node2와 node3 사이에 넣어보자
node2.next = node5
node5.next = node3
  • 📢 출력 결과

  • 🤔 객체지향 프로그래밍으로 구현하기

# 노드 클래스 만들기
class Node:
    def __init__(self, data, next=None):
        self.data = data
        self.next = next

# 노드 관리하는 클래스 만들기
class NodeMgmt:
    def __init__(self, data):
        self.head = Node(data)

    def add(self, data):
        if self.head == "":
            self.head = Node(data)
        else:
            node = self.head 
            while node.next:
                node = node.next
            node.next = Node(data)

    def desc(self):
        node = self.head
        while node:
            print(node.data)
            node = node.next
node_mgmt = NodeMgmt(2030)
node_mgmt.desc() # 2030
node_mgmt = NodeMgmt(0)

for data in range(10,21):
    node_mgmt.add(data)
node_mgmt.desc()
  • 📢 출력 결과

  • 🤔 노드 지우기

def remove(self, data):
        if self.head == "":
            print("해당 값을 가진 노드 없음")
            return
        if self.head.data == data:
            temp = self.head
            self.head = self.head.next
            del temp
        else:
            node = self.head
            while node.next:
                if node.next.data == data:
                    temp = node.next
                    node.next = node.next.next
                    del temp
                    pass
                else:
                    node = node.next
node_mgmt = NodeMgmt(0)

for data in range(1,10):
    node_mgmt.add(data)

node_mgmt.remove(5)
node_mgmt.desc()
  • 📢 출력 결과
    5가 삭제된 것을 볼 수 있음

👩‍💻 참고 링크

💕 피드백 환영 💕

profile
더 높이

0개의 댓글