没有指针的循环链表

时间:2014-03-14 02:28:28

标签: java node.js iterator

我正在尝试完成一个循环的双向链接列表编程项目。我们假设创建链接列表类,Node<E> Head作为唯一的即时变量。内部类中唯一的即时变量是Node current。 Node类有三个即时变量E dataNode<E> nextNode<E> prev

在使用CDLL调用的测试程序中,我们假设在打印出每个节点后使用迭代器内部类的next()hasNext()方法遍历整个列表。我遇到的问题是我无法弄清楚hasNext()方法如何知道一个循环何时完成并且每个节点都已打印出来。

换句话说,当current ==在循环的第一次迭代时返回并且在第二次循环开始时hasNext()返回false时,如何让current==head返回true。

我非常感谢您的任何见解。

2 个答案:

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