我需要实现一个循环的单链表数据结构。我无法理解的是我何时何地必须声明列表的最后一个节点必须指向第一个节点。我有以下空构造函数来构建列表:
public class SList<E> implements IList<E> {
protected SNode<E> firstNode = null;
public SList() {
firstNode = 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异常。
任何帮助都将不胜感激,谢谢。
答案 0 :(得分: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;
}