Недавно у меня была викторина, и вот как выглядел вопрос: -
Вы можете использовать следующий класс узлов:
class Node:
"""Lightweight, nonpublic class for storing a singly linked node."""
__slots__ = 'element', 'next' # streamline memory usage
def __init__(self, element, next): # initialize node's fields
self.element = element # reference to user's element
self.next = next # reference to next node
Предположим, у вас есть односвязный списокуникальные целые числа.Напишите метод Python, который обходит этот список, чтобы найти наименьший элемент, удаляет узел, содержащий это значение, и вставляет наименьшее значение в новый узел в начале списка.Наконец, верните указатель головы.Для простоты вы можете предположить, что узел, содержащий наименьшее значение, еще не находится в начале списка (т. Е. Вам никогда не придется удалять головной узел и повторно добавлять его снова).
Ваш методпередается заголовок списка в качестве параметра (типа Node), как в следующей сигнатуре метода:
def moveSmallest (head): вы можете использовать только класс Node;другие методы (например, size () и т. д.) недоступны.Кроме того, у вас есть только один указатель head (передается как параметр);у вас нет доступа к хвостовому указателю.
Например, если список содержит:
5 → 2 → 1 → 3, результирующий список будет содержать:
1→ 5 → 2 → 3 Подсказка 1: на этот вопрос есть несколько частей;разбить проблему и подумать о том, как выполнять каждую часть отдельно.
Подсказка 2: Если вам нужно выйти из цикла раньше, вы можете использовать команду прерывания.
Подсказка 3: Дляпустой список или список только с одним элементом, делать нечего!
Мой ответ:
def moveSmallest(h):
if h==None or h.next==None:
return h
# find part
temp=h
myList=[]
while temp!=None:
myList.append(temp.element)
temp=temp.next
myList.sort()
sv=myList[0]
# remove part
if h.element==sv and h.next!=None:
h=h.next
else:
start=h
while start!=None:
if start.next.element==sv and start.next.next!=None:
start.next=start.next.next
break
if start.next.element==sv and start.next.next==None:
start.next=None
break
start=start.next
# Insert part
newNode=Node(sv)
newNode.next=h
h=newNode
return h
Отметка получена = 10/30
Отзыв на мойответ:
"Не предполагается использовать сортировку; поиск в списке должен быть таким, каким мы его рассмотрели в классе.
Вы продвигаетесь слишком далеко вперед в списке, не проверяя, существуют ли узлы.
Просмотрите слайды «односвязного списка» и ответьте на этот вопрос, как подсказывают примеры.это к списку в качестве головного узла.Я запустил этот код, и он отлично работает.Как видно из отзыва, он говорит: «Вы продвигаетесь слишком далеко вперед в списке, не проверяя, существуют ли узлы».о котором позаботился первый оператор if в моем ответе и «Не предполагается использовать сортировку; поиск в списке должен быть таким, каким мы его рассмотрели в классе».Я считаю, что моей ошибкой было использование списка на первом месте, но, учитывая код, окончательный результат должен быть больше 20/30.Ребята, не могли бы вы проверить это или высказать свое мнение об этом отзыве?