当前位置: 首页 > 知识库问答 >
问题:

Java中的循环链表,何时指向第一个节点?

江温书
2023-03-14

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

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将停止遍历列表,然后将其下一个节点更改为我们要添加的节点newNode,并将newNode指向第一个节点。

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

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

共有1个答案

梅庆
2023-03-14

唯一的特殊情况是当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;
}
 类似资料:
  • 最近,我已经完成了检测循环中第一个节点的算法,如下所述:- 注:本声明摘自以下网站:- http://javabypatel.blogspot.in/2015/12/detect-loop-in-linked-list.html 步骤1:找到循环后,两个指针都指向在循环内的交汇点的公共节点, 步骤2:现在,在它们之间移动一个指针(比如乌龟)到列表的头部,保持野兔指针在循环内的交汇点的相同位置。 步

  • 给定一个单链表和中间节点从一开始的编号,我试图通过将最后一个节点指向中间节点来创建一个循环单链表。我写了以下代码: 然而,Linkedlist的最后一个节点仍然指向null而不是中间节点。我明白我哪里出错了,我找不到它。请帮忙。

  • 我尝试实现循环链表的insert方法。我想我取得了一些成功。 问题:当我显示列表时。display方法将循环,因为链接的每个next变量都链接到一个非Null节点对象。所以head永远不会是空对象。根据我对单链表的回忆,head总是指向列表中的第一个节点或其中包含数据的第一个节点。 我对循环链表的概念理解:根据我的理解,循环链表有点像一个单链表,但有一点小的变化:尾部对象的下一个变量指向头部。 来

  • 双向循环链表 在“数据结构”课程中,如果创建某种数据结构的双循环链表,通常采用的办法是在这个数据结构的类型定义中有专门的成员变量 data, 并且加入两个指向该类型的指针next和prev。例如: typedef struct foo { ElemType data; struct foo *prev; struct foo *next; } foo_t; 双向循环链表的

  • 我有一个基本的链表问题,我在下面试图解决。如果您能为我的方法、算法的正确性(甚至是编码风格)提供任何信息,我将不胜感激。该问题需要一个函数,该函数删除循环链表中所有出现的int,并返回列表中的任何节点或NULL(当列表为NULL时)。 以下是我目前掌握的一些C代码:

  • 本文向大家介绍双向链表和双向循环链表?相关面试题,主要包含被问及双向链表和双向循环链表?时的应答技巧和注意事项,需要的朋友参考一下 双向链表: 包含两个指针,一个prev指向前一个节点,一个next指向后一个节点。 双向循环链表: 最后一个节点的 next 指向head,而 head 的prev指向最后一个节点,构成一个环。