2015-04-04 4 views
5

Я знаю, как создавать классы Link и LinearLinkedList, но я просто не могу для жизни понять, как их модифицировать в создаваемый круглосуточный список. Я уже прочитал ответ на этот вопрос: Help with Circular Linked List in Python. Тем не менее, я не понимаю, как если голова равна None, то как может объект None-type иметь следующий атрибут? Я просто не могу понять концепцию. Если кто-то может показать мне init функции образца CircularLinkedList и простое объяснение того, как это работает, я думаю, что смогу его понять. Спасибо за любую помощьКак создать круговой LinkedList

Редактировать: Мне нужен только список, который нужно переместить вперед. Если это так, изменится ли его логика?

+0

Вы можете нарисовать диаграмму для такого списка с нулевым, одним, двумя и т. Д. Элементами? Это должно помочь вам понять, как организовать вещи. Кроме того, спросите себя, должен ли список содержать ссылки только в одном направлении или другом. –

+0

Мне только нужно, чтобы они были поодиночке связаны друг с другом. Разве это создает огромную разницу, если мне нужно, чтобы она проходила и назад? –

+0

Для чертежа это легко, но некоторые операции в односвязном списке сложнее, чем в двусвязном списке. –

ответ

5

Часто в круговом связанном списке имеется специальная ссылка, которая не содержит значимых данных. Вместо этого это «дозор», дающий вам знать, где начинается (и заканчивается) список. Эта ссылка будет существовать, даже если список пуст, поэтому ваши алгоритмы будут работать во всех списках без особых случаев, требующих специального кода.

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

class CircularLinkedList: 
    def __init__(self): 
     self.head = Link(None, None) # this is the sentinel node! 
     self.head.next = self.head # link it to itself 

    def add(self, data):    # no special case code needed for an empty list 
     self.head.next = Link(data, self.head.next) 

    def __contains__(self, data): # example algorithm, implements the "in" operator 
     current = self.head.next 
     while current != self.head: 
      if current.data == data: # element found 
       return True 
     return False 
+0

Предположим, я удалю последнюю ссылку. Будет ли она автоматически настраиваться на цикл до первой ссылки или мне придется вручную учитывать ее в моей функции удаления? * Подумал, играя с ним. Спасибо за помощь! –

0

Важным шагом здесь является то, что голова не None. Только данные узла головы Link составляют None, и он указывает на себя через свой атрибут next. Как уже упоминалось в ответе, который вы связали, это выглядит примерно так:

def __init__(self): 
    self.head = Link(None, None) 
    self.head.next = self.head 
+0

Я думаю, что я начинаю ее получать. Спасибо! –

2

Действительно; если нет узлов, то есть не может быть следующей/предыдущей указатели:

root 
| 
v 
None 

Если есть один узел, он связывает назад и вперед к себе:

root 
    | 
    v 
+-> Node <-+ 
| next---+ 
+---prev 

Если есть два узла:

 root 
     | 
     v 
    +-> Node +-> Node <--+ 
    | next---+ next--+ | 
+-|---prev <-----prev | | 
| +--------------------+ | 
+------------------------+ 
+1

Ваша ситуация для «нет узлов» - это не совсем то, что описывает OP (хотя это возможный подход). Вместо этого это более похоже на ситуацию, которую вы описываете как «один» узел. Однако ваш подход может быть более удобным представлением, поскольку он позволяет упростить тесты «Нет». – Joost

+0

Благодарим вас за визуальное представление. Я ценю помощь! –