每次我运行我的双链接列表时,除了从列表后面删除外,所有方法都有效。我有一张4,3,9的单子。我从前面拆下(这拿走了4个)。然后,我调用了这个方法,它应该只删除9。相反,当我调用DL列表时,它返回null(这也删除了3)。请帮忙。
public Object removeLast() {
Object result = null;
if (!isEmpty()) {
result = lastNode.getData();
lastNode = lastNode.getPreviousNode();
if (lastNode == null)
firstNode = null;
else
lastNode.setNextNode(null);
}
return result;
}
下面是代码的其余部分(它扩展了一个接口;生成的代码对于这个问题不是必需的,所以我们没有填写它。也就是说,节点后面的内容无关紧要)正确的代码:
public class DList implements DoubleEndedListInterface {
public Node lastNode;
public Node firstNode; // reference to first node
public int numberOfEntries;
@Override
public String toString() {
return "" + firstNode;
}
public Node getNodeAt(int givenPosition) {
assert !isEmpty() && (1 <= givenPosition)
&& (givenPosition <= numberOfEntries);
Node currentNode = firstNode;
// traverse the list to locate the desired node
for (int counter = 1; counter < givenPosition; counter++)
currentNode = currentNode.getNextNode();
assert currentNode != null;
return currentNode;
} // end getNodeAt
public void addFirst(Object newEntry) {
Node newNode = new Node(newEntry);
if (firstNode == null)
{
firstNode = newNode;
lastNode = newNode;
numberOfEntries++;
}
else
{
newNode.setNextNode(firstNode);
firstNode.setPreviousNode(newNode);
firstNode = newNode;
numberOfEntries++;
} // end if
} // end add
public void addLast(Object newEntry) {
Node newNode = new Node(newEntry);
if (firstNode == null)
{
firstNode = newNode;
//lastNode = newNode;
numberOfEntries++;
}
else
{
lastNode.setNextNode(newNode);
lastNode = newNode;
numberOfEntries++;
} // end if
} // end add
@Override
public Object removeFirst() {
Object result = firstNode.getData();
firstNode = firstNode.getNextNode();
if (numberOfEntries == 1)
lastNode = null; // solitary entry was removed
numberOfEntries--;
return result; // return removed entry, or
// null if operation fails
} // end remove
@Override
public Object removeLast() {
Object result = null;
if (!isEmpty()) {
result = lastNode.getData();
lastNode = lastNode.getPreviousNode();
if (lastNode == null)
firstNode = null;
else
lastNode.setNextNode(null);
}
return result;
}
@Override
public Object getFirst() {
// TODO Auto-generated method stub
return firstNode.getData();
}
@Override
public Object getLast() {
// TODO Auto-generated method stub
return lastNode.getData();
}
@SuppressWarnings("unchecked")
@Override
public void moveToEnd() {
Object temp = (Object) remove(1);
add(numberOfEntries + 1, temp);
}
public class Node {
public Object data; // entry in bag
public Node next; // link to next node
public Node previous;
public Node(Object dataPortion) {
this(dataPortion, null, null);
} // end constructor
public Node(Object dataPortion, Node nextNode, Node previousNode) {
data = dataPortion;
next = nextNode;
previous = previousNode;
} // end constructor
public Object getData() {
return data;
} // end getData
public void setData(Object newData) {
data = newData;
} // end setData
public Node getNextNode() {
return next;
} // end getNextNode
public Node getPreviousNode() {
return previous;
}
public void setPreviousNode(Node previous) {
this.previous = previous;
}
public void setNextNode(Node nextNode) {
next = nextNode;
} // end setNextNode
@Override
public String toString() {
return "Node [data=" + data + ", next=" + next + "]";
}
} // end Node
@Override
public void add(Object newEntry) {
// TODO Auto-generated method stub
}
@Override
public boolean add(int newPosition, Object newEntry) {
// TODO Auto-generated method stub
return false;
}
@Override
public Object remove(int givenPosition) {
// TODO Auto-generated method stub
return null;
}
@Override
public void clear() {
// TODO Auto-generated method stub
}
@Override
public boolean replace(int givenPosition, Object newEntry) {
// TODO Auto-generated method stub
return false;
}
@Override
public Object getEntry(int givenPosition) {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean contains(Object anEntry) {
// TODO Auto-generated method stub
return false;
}
@Override
public int getLength() {
// TODO Auto-generated method stub
return 0;
}
@Override
public boolean isEmpty() {
boolean result;
if (numberOfEntries == 0) // or getLength() == 0
{
assert firstNode == null;
result = true;
} else {
assert firstNode != null;
result = false;
} // end if
return result;
} // end isEmpty
@Override
public void swap(int i, int j) {
// TODO Auto-generated method stub
}
@Override
public boolean isTooBig() {
// TODO Auto-generated method stub
return false;
}
@Override
public void reduceArray() {
// TODO Auto-generated method stub
}
@Override
public Object[] toArray() {
// TODO Auto-generated method stub
return null;
}
@Override
public void makeRoom(int newPosition) {
// TODO Auto-generated method stub
}
@Override
public void removeGap(int givenPosition) {
// TODO Auto-generated method stub
}
@Override
public boolean removeObject(Object anObject) {
// TODO Auto-generated method stub
return false;
}
@Override
public int getPosition(Object anObject) {
// TODO Auto-generated method stub
return 0;
}
@Override
public void append(ListInterface bList) {
// TODO Auto-generated method stub
}
}
我看到的是:
addFirst
看起来不错,似乎此方法应该可以正常运行。
addLast
似乎不正确。特别是,如果通过addLast
将节点添加到空列表中,lastNode
成员变量将没有有效值。
然后RemveFirst
和RemveLast
都需要帮助,特别是在处理NumberOfEntry
成员和检查空列表时。
对于“list begins empty”条件,还应将“next”和“previous”指针设置为null,这样就不会有杂散数据干扰。
removeLast
非常合理,尽管可能缺少一个——numberOfEntries
。其余的代码我没有读,因为它有点太多了。
但是add
很奇怪:它似乎使用了一个局部变量lastNode
对一些字段lastNode
什么也不做。
我有一个头和lastNode的参考。嗨我有个问题。当我删除双向链表中的最后一个节点时,我必须将该节点的前一个引用设置为空,或者我可以离开它。我在删除lastNode时做了这样的事情。 当我使用toString方法时,它会按预期打印。只是想知道是否有必要将旧的last node prev设置为null。或者垃圾收集器只是删除它,因为没有对它的引用,即使旧节点仍然有对链接列表中某个节点的引用
我理解得对吗?(从虚拟节点开始) dummy->a->b->c->d->dummy(环绕到dummy节点) 因此,如果我想删除第一个实际的数据段(A),我需要将它分配给一个临时变量。所以Node first=head.next。然后我需要有一个虚拟的头部引用“B”,所以我需要做head.next=first.next。这就是所有需要做的吗? 在从列表中删除任何节点N的情况下(假设它在列表中),这是
我正在做一个双链表的实现。我希望链表有一定的长度限制。当列表变长时,删除最后一个节点。我这里有些问题。我想定义尾巴,这样我就不必寻找终点。下面是我正在研究的实现,它将允许长度为4,然后开始删除最后一个节点。 它似乎在删除最后一个节点,但之后会打印一些奇怪的符号。我猜这是我如何释放的问题,但我想不出来。注意:此代码中的一些代码取自https://gist.github.com/mycodeschoo
我试图从基于阉羊的双链表中删除一个元素,该列表中的节点满足返回bool的函数。由于某种原因,替换节点的前一个指针(下一个被删除)不更新,而是引用回它自己。 我的代码 测试结果
公共类LinkedList11{//私有内部类节点 }
问题内容: 我想从排序的链表{0 1 2 2 3 3 4 5}中删除重复项。 ` ` prev.setNext(tempHeader)在while循环内无法正常工作。理想情况下,当prev = 2且tempHeader = 3时,prev.next应该是data = 3的节点。 Printlist函数仅使用标题指针并打印列表。 节点定义如下。 问题答案: 循环已排序,因此您知道重复项将彼此相邻。如