2017-01-13 42 views
1

我开始创建变量head和队列的tail,这当然是他们自己的列表的元素,我写head = tail = null创建在构造一个空列表。在enq,我创建一个名为help列表中的新元素,它应该保存,我想在列表的末尾把(因为它是一个队列)的新元素。当然,队列中的tail始终是我们之前放在列表末尾的元素。然后我检查head是否为空(因为列表本身就是空的,或者是因为我们删除了它的第一个元素,它应该始终与head相同),并且,如果必要的话,我定义为headhelp。然后help应该显示给列表的一个新的空元素。将我的队列实现为列表有什么问题?

的问题是:当我测试程序,它停止后的第一个删除,并告诉我,该名单已经是空的。

我猜的错误在于方法deq内。我想通过写head = head.next删除第一个元素,但我们定义headhelp之前,因此,head.next是等同采用help.next,这与null相同的,所以 - 方法返回一个列表是空的,它停止PROGRAMM的boolean

我可能要改变的help.next的“方向”,但我看不出如何。如何使整个事情工作?

创建列表的元素:

public class Entry { 
    Object content; 
    Entry next; 
} 

清单的执行情况:

public class QueueList implements List { 

    private Entry head; 
    private Entry tail; 

    public QueueList() { 
    head = tail = null; 
    } 

    public boolean empty() { 
    return head == null; 
    } 

    public void enq(Object x) { 
    Entry help = new Entry(); 
    help.content = x; 
    tail = help; 

    if (head == null) { 
     head = help; 
    } 

    help.next = null; 
    } 

    public Object front() { 
    return head.content; 
    } 

    public void deq() { 
    head = head.next; 
    } 
} 
+0

抽奖得到解决,在一张纸上,你在你的ENQ方法的每一步在做什么(例如),当调用它两次连续。对其他方法做同样的事情。 –

+0

你从来没有将'Entry'对象的'next'值设置为其他任何值,而是null。所以当然'head = head.next;'会使你的头为空。只要看看你的代码,看看你在哪里修改'next'属性。 –

+0

我的猜测是,我简单地覆盖各'我打电话了ENQ法时间tail'。 – Borol

回答

0
public void enq(Object x) { 
    Entry help = new Entry(); 
    help.content = x; 
    **tail = help;** 

    if (head == null) { 
     head = help; 
    } 

    help.next = null; 
    } 

总是有将只有一个在任何时间的队列元素。

这可以使用下面的ENQ()方法

public void enq(Object x) { 
     Entry help = new Entry(x); 

     if (head == null) { 

      head = help; 

      tail = head; 

     } else { 
      if (head == tail) { 

       head.next = help; 
       tail = help; 



      } else { 

       this.tail.next = help; 
       this.tail = help; 
      } 
     } 

    }