Вы не можете выполнить функцию sort (), потому что ptr
может быть None, когда вы попадете в цикл while. Сначала это не очевидно из-за вашей проверки в начале
if self.head != None
Но вызов self.removeVal(pivot)
установит указатель вашей головы на None, если в списке есть только 1 запись. Обратите внимание, что это всегда будет происходить во время вашей быстрой сортировки, потому что вы рекурсивно разбиваете свой список. В конце концов, он ДОЛЖЕН быть списком из 1 элемента и, следовательно, потерпеть неудачу.
Когда это происходит, вы получаете отправленную вами стековую трассировку, где написано:
AttributeError: 'NoneType' object has no attribute 'next'
Чтобы исправить это, вы можете переписать цикл whileсмотреть на ptr
напрямую, а не на ptr.next
while ptr is not None:
if ptr.data<pivot:
smaller.append(ptr.data)
else:
other.append(ptr.data)
ptr=ptr.next
Еще одна проблема, которую я обнаружил, была с вашим заданием:
self=smaller
Это может быть допустимый код Python, но я нахожуэто очень опасно. Я изменил его на
self.head = smaller.head
В противном случае ваш пример удалил один элемент из списка (хотя я не отслеживал, почему именно). Обратите внимание, что это действительно не обновляет ваш атрибут длины, но я не виделзачем он нужен, он нигде не используется.
Еще одно замечание об эффективности: вы делаете много дополнений в своем алгоритме, и они ОЧЕНЬ дорого обходятся со списками, то есть способом, которым вы их реализовали. Это, вероятно, не в том, что вы здесь упражняетесь. Но когда вы добавляете итерацию по всем существующим элементам, вы убиваете эффективность быстрой сортировки. Добавление элемента стоит вам O (n) и, следовательно, разделение списка на ваш меньший и другой список уже стоит O (n ^ 2).
Для (связанных) списков сортировка слиянием - намного лучший алгоритм сортировки, которыйтакже запускает O (n * log (n)), как быстрая сортировка.