创建Deque类方法

时间:2012-04-17 18:33:50

标签: java

我需要编写自己的Deque类,并且必须使用双向链接列表实现来存储数据。问题是编写方法pushfromLeft(Thing thing),它将插入双端队列的左侧。以下是我到目前为止所做的,但似乎没有用。

 public void pushLeft(Thing thing) {
         Node beg = new Node();  
         Node end = new Node();
         Node T = new Node();  

       if(isEmpty())
       { 
             beg = first;
             end = last;
             beg = end;
             T = beg.thing;
             N++;
       }
       else
       {
             beg = beg.next;
             end = end.next;
             T = beg.previous;
             N++;


       }

4 个答案:

答案 0 :(得分:4)

除了更改Nitem之外,您在该方法中做的很少有任何影响。大概你应该修改first。如果你提供你的课程的领域,以及他们的意思,对于上下文会有所帮助。例如,不清楚item是什么。

您还应该为命名成员和局部变量提出不同的约定,或者始终使用this.或两者。

答案 1 :(得分:1)

我可以提出一些建议,可能会为你清除很多这个问题。这不是你要求的,但它可能就是你所需要的。

使用OO设计,这意味着不要对某些东西进行操作,而是要求某些东西自行操作。这意味着Node应该更加智能 - 目前你在节点上行动。

由于Node是双重链接的,因此它非常智能!它可以有以下方法:

newNode.insertBefore(currentNode)
newNode.insertAfter(currentNode) 
currentNode.remove() 

一旦你有了这些,你的代码的其余部分应该清理一下。鉴于双重链表,它们应该是微不足道的。

void insertBefore(node existing) {
    // first set my stuff up
    previous = existing.previous;
    next = existing;
    // then point other stuff at me
    previous.next = this; 
    existing.previous = this;
}

我认为 - 这只是我的头脑。

另一个问题是你如何处理你的“端点”。你的第一个和最后一个指针必须是Node的实例才能工作,但是如果他们注意到整个“If”因素超出原始代码!甜!

总是有一个第一个和最后一个对象开始指向彼此(并且从不接受值)。当你第一次添加时,先执行first.insertAfter()或者last.insertBefore(),然后就完成了。

顺便说一下,另一种可能性是使列表循环 - 没有理由说First和Last不能是相同的“Special”未分配节点,你仍然可以遍历它的Next(它会给你列表中的第一个真实项目)和上一个(给你列表中的最后一项)。

当迭代整个列表时,如果.value == null,你知道你已经把它转到了另一端,这使得node.next()和previous()非常容易实现(你甚至不需要)实现.next,但见下文。

/** returns null if there are no more items in the list */
Node next() {
    return next;
}

尝试一下,它会简化你的代码很多。大多数人真的不知道实际的OO代码是多么有用。

此外,将所有变量设为私有,这是一个很好的习惯。在这种情况下,当你有节点相互操作时,他们仍然可以访问彼此的私人成员(不像它听起来那么脏),所以你在编写它时仍然可以使用insertBefore而且你不必拥有getter和setter或公共变量。两全其美。

还要注意你在节点上“操作”的原始类如何消失 - 事实上,它可以完全消失。如果您需要一些特定的方法,如find(item)或insertSorted(item),则没有理由不能将它们添加到节点本身。直到你实现它之后,这可能很难看到。

有趣的是,如果你真的编码得很好,大多数人对Java的抱怨都没有出现。

答案 2 :(得分:0)

您是否将LinkedList源代码视为参考?

答案 3 :(得分:0)

您肯定不需要在内部添加方法中创建多个Node。如果您想稍后从左和右读取,则每个Node必须记住上一个和下一个元素。然后在添加时,您只需要重新找到这些链接,如下所示:

public void pushLeft(Thing thing) {
   Node newNode = new Node();  
   newNode.setValue(thing); //or just   newNode.value = thing;

   if(this.isEmpty())
   { 
         this.first = this.last = newNode;
         this.n=1;
   }
   else
   {
         this.first.previous = newNode;
         newNode.next = this.first;
         this.first = newNode;
         this.n++;
   }
}

为Node类创建一个自动设置值的构造器是明智的,那么你可以这样做:

Node newNode = new Node(thing);