Post

Python 04. [Algorithm 07] 연결 리스트

Python 04. [Algorithm 07] 연결 리스트

연결 리스트 (Linked List)


연결 리스트는 데이터 요소의 선형 집합으로, 데이터의 순서가 메모리에 물리적인 순서대로 저장되지는 않는다. 컴퓨터과학에서 배열과 함께 가장 기본이 되는 대표적인 선형 자료구조 중 하나로, 다양한 추상 자료형 (Abstract Data Type, ADT) 구현의 기반이 된다.

연결 리스트는 배열과는 달리 특정 인덱스에 접근하기 위해서는 전체를 순서대로 읽어야 하므로 상수 시간에 접근할 수 없다. 즉, 탐색은 느리지만 시작 또는 끝 지점에 아이템을 추가하거나 삭제, 추출하는 작업은 빠르다.

13 팰린드롬 연결 리스트


(Leet Code)

Q. 연결 리스트가 팰린드롬 구조인지 판별하라.

풀이 1 리스트 변환


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def isPalindrome(self, head: ListNode) -> bool:
    q: List = []

    if not head:
        return True

    node = head
    # 리스트 변환
    while node is not None:
        q.append(node.val)
        node = node.next
    
    # 팰린드롬 판별
    while len(q) > 1:
        if q.pop(0) != q.pop():
            reutrn False

    return True

풀이 2 데크를 이용한 최적화


파이썬의 데크 (Deque)는 이중 연결 리스트 구조로 양쪽 방향 모두 추출하는 데 시간 복잡도 \(O(1)\) 에 실행된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def isPalindrome(self, head: ListNode) -> bool:
    q: Deque = collections.deque()

    if not head:
        return True

    node = head
    while node is not None:
        q.append(node.val)
        node = node.next
    
    # 팰린드롬 판별
    while len(q) > 1:
        if q.popleft() != q.pop():
            reutrn False

    return True

풀이 3 고 (Go)를 이용한 데크 구현


데크가 없고, 복잡함. 코딩 테스트에는 적합하지 않음.

풀이 4 런너를 이용한 우아한 풀이


This post is licensed under CC BY 4.0 by the author.