包含对象的节点的堆栈实现



我有一个包含整数对象的NodesLinkedList

LinkedList listOfInts = new LinkedList();

加上Objects;

list.add(new Integer(8));
list.add(new Integer(5));
list.add(new Integer(3));
list.add(new Integer(4));

与以下Node类:

class Node {
 private Object data;
 private Node next;
 public Node(Object data) 
 {
   this.data = data;
   this.next = next;
 }
 public Object getData() 
 {
   return data;
 }
 public Node getNext() 
 {
   return next;
 }
 public void setNext(Node next) 
 {
   this.next = next;
 }
}

如果我这样做了;

Node p = listOfInts.pop()

然后打印数据,

System.out.println(p.getData());

我得到了正确答案:8.

但是如果我想把这个数字压入新的LinkedList;

LinkedList newStack = new LinkedList();
newStack.push(p);

它推入整个listOfInts,而不仅仅是第一个数据点,8。

 [8,5,3,4];

我的问题是为什么会发生这种情况?由于这是一个如此基本的问题,我认为它与我的push()pop()方法有关,但由于我编写的方法与我在教科书中看到的方法相似,我不知道它们出了什么问题。有人能帮我理解吗?

public Node pop()
{
  Node item = peek(); //save item to return
  if(!isEmpty())
  {
    first = first.getNext(); //delete first node
  }
  size--;
  return item; //return first saved item
}
public void push(Node item)
{
  Node next = item.getNext();
  next = first;
  first = item;
  size++;
}
public Node peek()
{
  if (isEmpty())
  {
    System.out.println("Error: No element");
  }
  return first;
}

编辑:按照建议返回对象而不是Nodes,代码或多或少相同,除了push()方法。因此,当我尝试将另一个对象添加到相同的LinkedList时,它会替换旧的对象而不是添加到列表中。

 //push node on top of the stack
 public void push(Object item)
 {
   Node newNode = new Node(item);
   Node next = newNode.getNext();
   next = first;
   first = newNode;
   size++;
  }//push

当调用pop时,您的实现返回Node对象,但Node仍然有对原始堆栈内"下一个"位置的引用。

当你创建一个新的堆栈时,你推入弹出的项目,原始的Node对象伴随着它的原始next引用。

listOfInts -----> { 5 } -> { 3 } -> { 4 }
                    ^
newStack  -> { 8 } -+

这就是为什么整个列表出现在新的堆栈上。

解决方案是根本不公开Node对象。不接受push中的Node,而是接受数据项,并创建自己的Node。不是在poppeek中返回Node,而是从Node中提取数据项并返回它。这样,您就不会无意中冒泄漏对所需节点中下一个Node的引用的风险。

相关内容

  • 没有找到相关文章

最新更新