2015-10-20 5 views
0

Я пытаюсь реализовать алгоритм для удаления дубликатов из связанного списка, но мой алгоритм замораживается, когда дело доходит до того, что текущий узел имеет данные, равные следующему.Linkedlist Удалить дубликаты без буфера

class Node: 
    def __init__(self, data, next): 
     self.data = data 
     self.next = next 

class LinkedList: 
    def __init__(self, head = None): 
     self.head = head 

    def add(self, item): 
     newNode = Node(item, self.head) 
     self.head = newNode 

    def printit(self): 
     current = self.head 
     while current is not None: 
     print(current.data) 
     current = current.next 

    def removeDuplicates(self): 
     current = self.head 
     while current != None: 
     runner = current 
     while runner.next != None: 
      if runner.next.data == current.data: 
       runner.next = current.next.next 
      else: 
       runner = current.next 
     current = current.next 




mylist = LinkedList() 

mylist.add(31) 
mylist.add(77) 
mylist.add(31) 
mylist.add(22) 
mylist.add(22) 
mylist.add(22) 

mylist.printit() 
mylist.removeDuplicates() 
mylist.printit() 

Возможно, это действительно глупо, но я не могу определить его прямо сейчас, любые идеи?

+1

'next' - это ключевое слово python. Используйте другое имя, чтобы избежать путаницы. – kmad1729

ответ

2

В вашем время цикла:

runner = current.next 

должен быть

runner = runner.next 

иначе он просто продолжает принимать тот же current.next на каждой итерации, так как он никогда не изменяет current в петле. То же самое исправить пару строк раньше.

+0

Вы были правы! Ty. На самом деле я был в замешательстве, я создал бегуна, чтобы избежать изменения указателя внешнего цикла, а затем в моей голове была идея «тока». – John

+0

Всегда легче видеть этот материал свежей парой глаз. В отладчике стоит однократный шаг, особенно если вы не можете заставить кого-то просмотреть свой код, чтобы увидеть, где реальность и ваши ожидания принадлежат компании. – Useless

+0

'runner.next = current.next.next' также должен быть' runner.next = runner.next.next'. – kmad1729

Смежные вопросы