면접 문제 - 연결 리스트

업데이트:

단방향 링크드 리스트 구현

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

class LinkedList:
    def __init__(self, arr):
        self.head = None
        cur_node = None
        self.length = len(arr)
        for i in range(len(arr)):
            if cur_node is None:
                self.head = Node(arr[i])
                cur_node = self.head
            else:
                cur_node.next = Node(arr[i])
                cur_node = cur_node.next

    def __repr__(self):
        rep = []
        cur_node = self.head
        while cur_node:
            rep.append(cur_node.data)
            cur_node = cur_node.next
        return str(rep)

뒤에서 k번째 원소 구하기

단방향 연결 리스트가 주어졌을 때 뒤에서 k번째 원소를 찾는 알고리즘을 구현하라

def elem_from_tail1(linked_list:LinkedList, k:int) -> any:
    '''
    연결 리스트의 길이를 알고 있을 때
    '''
    cur_node = linked_list.head
    for _ in range(linked_list.length-k):
        cur_node = cur_node.next
    return cur_node.data

def elem_from_tail2(linked_list:LinkedList, k:int) -> any:
    '''
    부가 포인터를 이용한 방법
    시간 O(N), 공간 O(1)
    '''
    cur_node = linked_list.head
    runner = linked_list.head
    for _ in range(k):
        runner = runner.next
    while runner:
        runner = runner.next
        cur_node = cur_node.next
    return cur_node.data

def elem_from_tail3(linked_list:LinkedList, k:int) -> any:
    '''
    재귀를 이용한 방법
    시간 O(N), 공간 O(N)
    '''
    answer = []
    def recurse(node:Node, answer:list) -> tuple:
        if node is None: # tail
            return 0
        cur_k = recurse(node.next, answer)+1
        if cur_k == k:
            answer.append(node.data)
        return cur_k
    recurse(linked_list.head, answer)
    return answer[0]

중간 노드 삭제

단방향 연결리스트에서 중간에 있는 노드 하나를 삭제하는 알고리즘을 구현하라. 단, 삭제할 노드에만 접근할 수 있다.

def remove(node: Node):
    '''
    다음 노드를 현재 노드로 복사 후 다음 노드를 삭제
    '''
    next_node = node.next
    node.data = next_node.data
    node.next = next_node.next
    del next_node

리스트의 합

연결 리스트로 숫자를 표현할 때 각 노드가 자릿수 하나를 가리키는 방식으로 표현할 수 있다. 각 숫자는 역순으로 배열되어 있는데, 첫번쨰 자리수가 리스트의 맨 앞에 위치하도록 배열된다는 뜻이다. 이와 같은 방식으로 표현된 숫자 두 개가 있을 때, 이 두 수를 더하여 그 합을 연결 리스트로 반환하는 함수를 작성하라.

def add_ll(ll1: LinkedList, ll2: LinkedList) -> LinkedList:
    def get_num(cur_node:Node) -> int:
        if cur_node is None:
            return 0
        return get_num(cur_node.next)*10 + cur_node.data
        
    num = get_num(ll1.head) + get_num(ll2.head)
    new_ll = LinkedList()
    while num:
        digit = num % 10
        if new_ll.head is None:
            new_ll.head = Node(digit)
            cur_node = new_ll.head
        else:    
            cur_node.next = Node(digit)
            cur_node = cur_node.next
        num = num // 10
    return new_ll

문제 출처

Cracking the Coding Interview

댓글남기기