2015-04-27 3 views
1

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

Проблема: Когда я показываю список. Метод отображения будет циклическим, потому что каждая следующая переменная ссылки связана с ненулевым объектом узла. Поэтому голова никогда не будет нулевым объектом. Из того, что я вспоминаю об односвязном списке, head всегда указывает на первый узел в списке или на первый узел с данными внутри него.

Мое концептуальное понимание кругового связанного списка: Из того, что я могу понять, круговой связанный элемент похож на отдельный список, но с небольшим завихрением: следующая переменная хвостового объекта указывает на голову.

Я кодирую его, как показано диаграммой, предоставленной исходной ссылкой.

Источник: http://sourcecodemania.com/circular-linked-lists/

public void insert(String data) 
    { 
     Link link = new Link(data); 

     if(head == null) 
     { 
      head = link; 
      tail= link; 
     } 
     else 
     { 
      tail.next = link; 
      tail = link; 
      tail.next = head; 

     } 
    } 


public void display() 
    { 


     // good implementation for display #2 
     while(head != null) 
     { 
     // System.out.println (head.data); 
      head = head.next; 
     } 
    } 

ответ

1

После того, как вы вставите по крайней мере один элемент, вы бы никогда не попадались нуль. Он будет продолжаться до бесконечности.

Кроме того, было бы неплохо изменить голову только для отображения списка. Операция, такая как дисплей, не должна иметь никаких побочных эффектов.

Вместо этого сохраните размер поля члена в своем классе списка и обновите его в каждом методе вставки и удаления.

Теперь вы знаете, сколько раз вы должны перебирать петлю.

ListClassName current = head; // Head is not modified. 
for (int i = 0; i < this.size; i++) { 
// System.out.println (current.data); 
    current = current.next; 
} 

Удачи.

+0

Большой обходной путь, имея счетчик размера! – Nicholas

+0

Рад знать, что это помогло. –

1

Вы можете сохранить ссылку на первый объект Link и проверьте, чтобы убедиться, что голова не равен этим объект в то время как цикл:

public void display() 
{ 
    boolean first=true; 
    Link firstItem=null; 
    // good implementation for display #2 
    while(head != null && head!= firstItem) 
    { 
     if(first){ 
      firstItem=head; 
      first=false; 
     } 
    // System.out.println (head.data); 
     head = head.next; 
    } 
} 
+0

Это хорошая идея и экономит нас от хранения размера, но это поставит ограничение, что список больше не сможет хранить повторяющиеся элементы. –

+0

В этом случае: «head! = FirstItem» тестирует equallity на основе ссылки на объект, поэтому это может быть только false, если это точно такой же объект. – Brimzi

+0

Да. Ты прав. Этот метод не позволит нам вставить точно такой же объект дважды в список. –

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