Круговой связанный список и доступ к предыдущему / следующему изнутри узла - PullRequest
0 голосов
/ 06 января 2012

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

class Bus {

    private Bus previous;
    private Bus next;

    public Bus() {
      //anything
    }

    public void setPrevious(Bus bus) {
      this.previous = bus;
    }

    public void setNext(Bus bus) {
      this.next = bus;
    }

    private void someMethod() {
     // if (previous.xxx() && next.xxx()) {
     //   do something
     // } 
    }

}

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

Ответы [ 4 ]

1 голос
/ 06 января 2012

Если вы настраиваете методы setNext и setPrevious не только для обновления их экземпляра, но и для экземпляра, установленного как next и как previous, вы должны зависеть от внешнего механизма.

Допустим, вы изначально создали Bus A и B. Когда вы вызываете A.setNext( B ), он также должен обновить предыдущий узел B, не вызывая B.setPrevious( A ). Аналогично тому, как когда вы добавляете что-то в LinkedList в Java, вам не нужно вручную устанавливать связь между последним объектом и только что добавленным объектом. Что-то вроде

public void setPrevious(Bus bus) {
  this.previous = bus;
  if ( bus.next != this ){
    bus.next = this;
  }
}

Конечно, тогда вам все равно придется рассмотреть сценарий, в котором шина уже содержится в другом List, что вам также необходимо обновить этот List.

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

1 голос
/ 06 января 2012

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

Bus one = new Bus();
Bus two = new Bus();
Bus three = new Bus();

one.setPrevious(three);
one.setNext(two);

two.setPrevious(one);
two.setNext(three);

three.setPrevious(two);
three.setNext(one);

Это более или менее идея циркулярного связного списка. Я рекомендую посмотреть , что еще один вопрос, чтобы понять связанный список. Сделать это по кругу легко.

1 голос
/ 06 января 2012

Просто мысль, но, возможно, есть один класс для узлов и один для списка.Таким образом, вы можете иметь конструктор для класса узла, который обрабатывает установку его следующей и последней ссылок.Это позволяет списку действительно беспокоиться только о стандартных функциях списка, таких как Add().

Взгляните на интерфейс списка.

0 голосов
/ 06 января 2012

Зачем вам массив? У вас уже есть ссылки на каждый объект.

...