我需要编写自己的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++;
}
答案 0 :(得分:4)
除了更改N
和item
之外,您在该方法中做的很少有任何影响。大概你应该修改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);