"""
Связный список (LinkedListPhoneBook)

Узел представляется словарём:
{'name': 'Имя', 'phone': '123', 'next': None}.
"""


def ll_insert(head : dict|None, name: str, phone: str) -> dict:
    """
    Проходит до конца (или сразу добавляет в конец) и возвращает новую
    голову (если вставка в начало) или изменяет список по ссылке.
    Удобнее возвращать новую голову, если вставка может быть в начало.
    """

    newNode = {'name': name, 'phone': phone, 'next': None}
    if head == None:
        return newNode
    
    currentNode = head
    while currentNode['next'] != None:
        if currentNode['name'] == name:
            currentNode['phone'] = phone
            return head
        currentNode = currentNode['next']
    currentNode['next'] = newNode
    return head

def ll_find(head : dict|None, name: str) -> str|None:
    """Ищет узел, возвращает телефон или None."""
    currentNode = head
    while currentNode != None:
        if currentNode['name'] == name:
            return currentNode['phone']
        currentNode = currentNode['next']
    return None

def ll_delete(head : dict|None, name: str) -> dict|None:
    """Удаляет узел, возвращает новую голову."""
    if head == None:
        return None
    
    if head['name'] == name:
        return head['next']
    
    currentNode = head
    while currentNode['next'] != None:
        if currentNode['next']['name'] == name:
            currentNode['next'] = currentNode['next']['next']
            return head
        currentNode = currentNode['next']
    return head

def ll_list_all(head: dict|None) -> list:
    """Cобирает все записи в список и сортирует.
    сортировка вынесена отдельно)."""
    records = []
    currentNode = head
    while currentNode != None:
        records.append((currentNode['name'], currentNode['phone']))
        currentNode = currentNode['next']
    records.sort(key=lambda item: item[0])
    return records