我正在尝试完成一个循环的双向链接列表编程项目。我们假设创建链接列表类,Node<E>
Head作为唯一的即时变量。内部类中唯一的即时变量是Node current。 Node类有三个即时变量E data
,Node<E> next
和Node<E> prev
。
在使用CDLL
调用的测试程序中,我们假设在打印出每个节点后使用迭代器内部类的next()
和hasNext()
方法遍历整个列表。我遇到的问题是我无法弄清楚hasNext()
方法如何知道一个循环何时完成并且每个节点都已打印出来。
换句话说,当current ==在循环的第一次迭代时返回并且在第二次循环开始时hasNext()
返回false时,如何让current==head
返回true。
我非常感谢您的任何见解。
答案 0 :(得分:0)
由于实例变量的限制,似乎不可能。
但是,如果你没有将你的尾节点链接到头节点,你可以实现&#34; hasNext&#34;。
然后它不再是循环的。
但是你不必使列表实际上是循环的。
如果您发现下一个节点为空,请改为获取头节点。
然后它几乎是圆形的。
答案 1 :(得分:0)
编辑:
换句话说,当current ==在循环的第一次迭代时返回时,如何让hasNext()返回true,并在第二次循环开始时当current == head时返回false。
所以你的问题是你的东西当前==头是重要的。这不重要,在圆形情况下重要的是nextNode() - 也就是接下来会发生什么?
假设HEAD是对列表开头的引用,并且最后一个节点.next()指向HEAD节点。
// psudocode.
boolean hasNext()
if current.next() == head
return false
else
return true
编辑:
好的,这是一个如何进行迭代的非常简单的版本
public void iterateAndPrint(Node head) :
Node current = head;
// check for null case
if(current == null)
return
// case of list where ther eis only one node - HEAD...
if(!current.hasNext())
print current.name
return
// ok so the nodes aren't empty, and there are more than just the head node.
while(true):
// as long as has next returns true, print the name and then set current to next node
if(current.hasNext())
print current.name
current = current.next()
// has next returned false - we're on the last node. Make sure it's not equal to Head (redundant at this point)
else if (!current.hasNext() && current!=head)
print current.name
break
// i don't think this is strictly nescesary, but better safe than sorry.
else:
break
public void hasNext(Node current, Node head):
if(current.next() == head):
return false
else:
return true