循环链表和从节点内部访问上一个/下一个

时间:2012-01-05 22:46:11

标签: java linked-list circular-list

我需要圆形对象列表。每个人都应该知道前一个或下一个。我这样做了:

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 个答案:

答案 0 :(得分:1)

只是一个想法,但可能有一个节点的类和一个列表。通过这种方式,您可以为节点类创建一个构造函数,用于处理其下一个和最后一个引用的设置。这使得列表真的只需要担心像Add()这样的标准列表函数。

查看List界面。

答案 1 :(得分:1)

链表不需要数组。要创建列表,您需要使用下一个和上一个方法来连接对象,并将最后一个与第一个连接起来(做循环)。使用示例(使用您的实现):

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);

或多或少的链接列表循环的想法。我建议see另一个问题是了解链接列表。要做到这一点很简单。

答案 2 :(得分:1)

如果您调整setNextsetPrevious方法,不仅要更新其实例,还要更新设置为nextprevious的实例。在外部机制上。

因此,假设您最初创建了Bus AB。当您致电A.setNext( B )时,它还应更新B的上一个节点,而无需致电B.setPrevious( A )。与在Java中向LinkedList添加内容类似,您不必手动设置最后一个对象与刚刚添加的对象之间的链接。像

这样的东西
public void setPrevious(Bus bus) {
  this.previous = bus;
  if ( bus.next != this ){
    bus.next = this;
  }
}

当然,您仍然需要考虑总线已经包含在另一个List中的情况,您必须更新List

因此,建议将节点与实际总线实例分开,如其他响应之一所示,这是一个更好的主意。这允许您将总线添加到多个列表,并使编写循环列表可能更容易(或者只是使用列表的可用实现)。这也是更好的OO设计,因为您可以重复使用您编写的列表。

答案 3 :(得分:0)

为什么需要阵列?您已经在每个对象中都有引用。