

from typing import Any, Dict, List, Optional


Node = Dict[str, Any]


def _make_node(name: str, phone: str) -> Node:
    return {"name": name, "phone": phone, "next": None}


def sort_records(records: List[Dict[str, str]]) -> List[Dict[str, str]]:

    return sorted(records, key=lambda x: x["name"])


def ll_insert(head: Optional[Node], name: str, phone: str) -> Node:

    new_node = _make_node(name, phone)

    if head is None:
        return new_node

    current = head
    while current is not None:
        if current["name"] == name:
            current["phone"] = phone
            return head
        if current["next"] is None:
            current["next"] = new_node
            return head
        current = current["next"]

    return head


def ll_find(head: Optional[Node], name: str) -> Optional[str]:
    current = head
    while current is not None:
        if current["name"] == name:
            return current["phone"]
        current = current["next"]
    return None


def ll_delete(head: Optional[Node], name: str) -> Optional[Node]:
    if head is None:
        return None

    if head["name"] == name:
        return head["next"]

    prev = head
    current = head["next"]

    while current is not None:
        if current["name"] == name:
            prev["next"] = current["next"]
            return head
        prev = current
        current = current["next"]

    return head


def ll_list_all(head: Optional[Node]) -> List[Dict[str, str]]:
    records: List[Dict[str, str]] = []
    current = head
    while current is not None:
        records.append({"name": current["name"], "phone": current["phone"]})
        current = current["next"]
    return sort_records(records)
