【问题标题】:Circular linked list in Java, when to point to first node?Java中的循环链表,何时指向第一个节点?
【发布时间】:2015-02-22 16:34:17
【问题描述】:

我需要实现一个循环单链表数据结构。我难以理解的是我必须在何时何地声明列表的最后一个节点必须指向第一个节点。我有以下空构造函数来构建列表:

public class SList<E> implements IList<E> {

    protected SNode<E> firstNode = null;

    public SList() {
        firstNode = null;
    }

所以基本上每个列表都以一个 null 对象开始,该对象再次指向 null,表示列表的结尾:

public class SNode<E> {

E elem;
public SNode<E> nextNode = null;
...

但是我不知道如何做到这一点,以便当列表包含至少一个节点时,该节点将指向列表的第一个节点。

例如,看看我为常规链表实现的 addLast() 方法:

    public void addLast(E newElem) {
        SNode<E> newNode= new SNode<E>(newElem);
        SNode<E> nodeTraveler = firstNode;
        while (nodeTraveler.nextNode != null) {
            nodeTraveler= nodeTraveler.nextNode;
        }
        nodeTraveler.nextNode = newNode;
     }

我将不得不将其更改为:

    public void addLast(E newElem) {
    SNode<E> nodeTraveler = firstNode;
    SNode<E> newNode = new SNode<E>(newElem);
    while (nodeTraveler.nextNode != firstNode){
        nodeTraveler = nodeTraveler.nextNode;
    }
    nodeTraveler.nextNode = newNode;
    newNode.nextNode = firstNode;
}

nodeTraveler 将停止遍历列表,一旦它的下一个节点与 firstNode 匹配(意味着它在最后一个位置),然后它将其 nextNode 更改为我们要添加的那个 newNode,并将 newNode 指向 firstNode .

理论上,这应该可行,但由于我实际上从未在此方法之前将最后一个元素指向第一个元素(这是我的主要问题,默认情况下如何将最后一个元素指向第一个元素),我当代码到达 while 迭代时,得到一个 nullPointer 异常。

任何帮助将不胜感激,谢谢。

【问题讨论】:

  • 检查空指针。这就是你如何知道你在尾巴的末端。
  • stackoverflow.com/questions/7266042/java-ring-buffer 上有关 Java 环形缓冲区的可能相关问题。除非您这样做是为了练习,否则可能值得考虑使用 Apache Commons CircularFifoBuffer。
  • @RobertHarvey 是的,我可以检查空指针,但这仅适用于方法的第一次调用,因为在那之后,最终元素将指向第一个。我想使用循环列表的目的是没有空指针。
  • @paisanco 是的,这是为了练习,以全面了解列表的工作原理。无论如何,谢谢你的链接,会检查一下!
  • 如果您愿意,您可以将最后一个元素指向第一个元素,但我会保留一个头指针和一个尾指针,并带有逻辑回绕。见en.wikipedia.org/wiki/Circular_buffer

标签: java list nodes circular-reference


【解决方案1】:

唯一的特殊情况是firstNode == null,这是初始情况。

之后,第一个add会给出下一个元素为self的节点:

public void addLast(E newElem) {
    SNode<E> newNode = new SNode<E>(newElem);
    if(firstNode == null) {
        firstNode = newNode;
    } else {
        SNode<E> traveler = firstNode;
        for( ; traveler.nextNode != firstNode ; traveler = traveler.nextNode) {}
        traveler.nextNode = newNode;
    }
    newNode.nextNode = firstNode;
}

【讨论】:

  • 我明白了,谢谢!所以可以肯定地说没有让 Java 知道我的最后一个元素指向第一个元素的默认方式,我只需要修改我的所有方法才能做到这一点?
猜你喜欢
  • 2016-08-10
  • 2014-12-13
  • 1970-01-01
  • 2010-11-10
  • 2015-08-08
  • 1970-01-01
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
相关资源
最近更新 更多