74 lines
1.7 KiB
Python
74 lines
1.7 KiB
Python
|
|
|
|
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)
|