2026-02-25 06:00:04 +00:00
|
|
|
|
def create_node(name: str, phone: str, next: dict = None):
|
|
|
|
|
|
return {"name": name, "phone": phone, "next": next}
|
2026-02-25 05:40:42 +00:00
|
|
|
|
|
|
|
|
|
|
|
2026-02-25 06:00:04 +00:00
|
|
|
|
def create_linked_list(data: list[dict]) -> dict:
|
2026-03-18 10:49:02 +00:00
|
|
|
|
"""Создание связного списка по массиву словарей.
|
|
|
|
|
|
|
|
|
|
|
|
:param data: Список словарей с параметрами: {'name': str, 'phone': str, next: dict | None}
|
|
|
|
|
|
:type data: list[dict]
|
|
|
|
|
|
:raises ValueError: Ошибка при подаче на вход пустого списка
|
|
|
|
|
|
:return: Связный список оформленный по примеру: {'name': str, 'phone': str, next: dict | None}
|
|
|
|
|
|
:rtype: dict
|
|
|
|
|
|
"""
|
2026-02-25 06:00:04 +00:00
|
|
|
|
if data is None or len(data) == 0:
|
|
|
|
|
|
raise ValueError("Список пустой!")
|
2026-03-18 10:49:02 +00:00
|
|
|
|
|
2026-02-25 06:00:04 +00:00
|
|
|
|
base = create_node(**data[0])
|
|
|
|
|
|
|
|
|
|
|
|
current = base
|
|
|
|
|
|
for value in data[1:]:
|
2026-03-18 10:49:02 +00:00
|
|
|
|
current["next"] = create_node(**value)
|
|
|
|
|
|
current = current["next"]
|
|
|
|
|
|
|
2026-02-25 06:00:04 +00:00
|
|
|
|
return base
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-03-18 10:49:02 +00:00
|
|
|
|
def ll_insert(head: dict, name: str, phone: str) -> dict:
|
2026-03-18 16:52:13 +00:00
|
|
|
|
"""Добавление нового или редактирование элемента в связном списке
|
|
|
|
|
|
|
|
|
|
|
|
Если пользователь уже есть в списке, то обновятся его данные (номер телефона). В случае если
|
|
|
|
|
|
данных нет, то они добавляются в конец.
|
|
|
|
|
|
|
|
|
|
|
|
:param head: Список словарей с параметрами: {'name': str, 'phone': str, next: dict | None}
|
|
|
|
|
|
:type head: dict
|
|
|
|
|
|
:param name: Имя пользователя (не должно повторятся с имеющимися)
|
|
|
|
|
|
:type name: str
|
|
|
|
|
|
:param phone: Номер телефона пользователя (не должно повторятся с имеющимися)
|
|
|
|
|
|
:type phone: str
|
|
|
|
|
|
:raises ValueError: Ошибка при подаче на вход пустого списка
|
|
|
|
|
|
:return: Возвращает связный список с обновленными данными
|
|
|
|
|
|
:rtype: dict
|
|
|
|
|
|
"""
|
2026-03-18 10:49:02 +00:00
|
|
|
|
if head is None:
|
|
|
|
|
|
raise ValueError("Словарь пустой!")
|
|
|
|
|
|
|
|
|
|
|
|
current = head
|
|
|
|
|
|
while current["next"] is not None:
|
|
|
|
|
|
if current.get("name") == name or current.get("phone") == phone:
|
|
|
|
|
|
current["name"] = name
|
|
|
|
|
|
current["phone"] = phone
|
|
|
|
|
|
break
|
|
|
|
|
|
current = current.get("next")
|
|
|
|
|
|
else:
|
|
|
|
|
|
current["next"] = {"name": name, "phone": phone, "next": None}
|
|
|
|
|
|
|
|
|
|
|
|
return head
|
2026-02-25 06:00:04 +00:00
|
|
|
|
|
|
|
|
|
|
|
2026-03-06 06:55:45 +00:00
|
|
|
|
def ll_find(head: dict, name: str) -> str | None:
|
2026-03-18 16:52:13 +00:00
|
|
|
|
"""Поиск пользователя в связном списке
|
|
|
|
|
|
|
|
|
|
|
|
Если функция найдёт пользователя по имени, то вернёт его номер телефона.
|
|
|
|
|
|
В противном случае будет возвращено значение None.
|
|
|
|
|
|
|
|
|
|
|
|
В случае повторяющихся имен в списке, выведется выше стоящие
|
|
|
|
|
|
|
|
|
|
|
|
:param head: Список словарей с параметрами: {'name': str, 'phone': str, next: dict | None}
|
|
|
|
|
|
:type head: dict
|
|
|
|
|
|
:param name: Имя пользователя
|
|
|
|
|
|
:type name: str
|
|
|
|
|
|
:raises ValueError: Ошибка при подаче на вход пустого списка
|
|
|
|
|
|
:return: Возвращает номер телефона найденного пользователя, иначе None
|
|
|
|
|
|
:rtype: str | None
|
|
|
|
|
|
"""
|
2026-03-06 06:55:45 +00:00
|
|
|
|
if head is None:
|
|
|
|
|
|
raise ValueError("Словарь пустой!")
|
2026-03-18 10:49:02 +00:00
|
|
|
|
|
2026-03-06 06:55:45 +00:00
|
|
|
|
current = head
|
2026-03-18 10:49:02 +00:00
|
|
|
|
while current is not None:
|
|
|
|
|
|
if current["name"] == name:
|
|
|
|
|
|
return current["phone"]
|
|
|
|
|
|
current = current["next"]
|
2026-03-06 06:55:45 +00:00
|
|
|
|
return None
|
2026-02-25 06:00:04 +00:00
|
|
|
|
|
|
|
|
|
|
|
2026-03-18 10:49:02 +00:00
|
|
|
|
def ll_delete(head: dict, name: str) -> dict:
|
2026-03-18 16:52:13 +00:00
|
|
|
|
"""Удаление пользователя из связного списка
|
|
|
|
|
|
|
|
|
|
|
|
:param head: Список словарей с параметрами: {'name': str, 'phone': str, next: dict | None}
|
|
|
|
|
|
:type head: dict
|
|
|
|
|
|
:param name: Имя пользователя
|
|
|
|
|
|
:type name: str
|
|
|
|
|
|
:raises ValueError: Ошибка при подаче на вход пустого списка
|
|
|
|
|
|
:return: Возвращает связный список с обновленными данными
|
|
|
|
|
|
:rtype: dict
|
|
|
|
|
|
"""
|
2026-03-18 10:49:02 +00:00
|
|
|
|
if head is None:
|
|
|
|
|
|
raise ValueError("Словарь пустой!")
|
2026-02-25 06:00:04 +00:00
|
|
|
|
|
2026-03-18 10:49:02 +00:00
|
|
|
|
if head.get("name") == name:
|
|
|
|
|
|
head = head.get("next")
|
|
|
|
|
|
return head
|
2026-02-25 06:00:04 +00:00
|
|
|
|
|
2026-03-18 10:49:02 +00:00
|
|
|
|
current = head
|
|
|
|
|
|
while current.get("next") is not None:
|
|
|
|
|
|
if current.get("next").get("name") == name:
|
|
|
|
|
|
current["next"] = current.get("next").get("next")
|
|
|
|
|
|
return head
|
|
|
|
|
|
current = current.get("next")
|
|
|
|
|
|
|
|
|
|
|
|
return head
|
2026-02-25 06:00:04 +00:00
|
|
|
|
|
|
|
|
|
|
|
2026-03-18 10:49:02 +00:00
|
|
|
|
def ll_list_all(head: dict) -> list:
|
|
|
|
|
|
result = []
|
|
|
|
|
|
current = head
|
|
|
|
|
|
while current is not None:
|
|
|
|
|
|
result.append({"name": current.get("name"), "phone": current.get("phone")})
|
|
|
|
|
|
current = current.get("next")
|
|
|
|
|
|
return result
|
|
|
|
|
|
|