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

Java 包含对象的节点的堆栈实现,java,linked-list,stack,Java,Linked List,Stack,我有一个包含整数对象的节点的链接列表 LinkedList listOfInts = new LinkedList(); 我添加了对象 list.add(new Integer(8)); list.add(new Integer(5)); list.add(new Integer(3)); list.add(new Integer(4)); 使用以下节点类: class Node { private Object data; private Node next; public No

我有一个包含整数对象的
节点的
链接列表

LinkedList listOfInts = new LinkedList();
我添加了
对象

list.add(new Integer(8));
list.add(new Integer(5));
list.add(new Integer(3));
list.add(new Integer(4));
使用以下
节点
类:

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 newStack = new LinkedList();
newStack.push(p);
它推送整个列表,而不仅仅是第一个数据点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;
}
编辑:按建议返回对象,而不是
节点
,代码大致相同,除了
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
时,您的实现将返回
节点
对象,但是
节点
仍然引用原始堆栈中的“下一个”位置

创建新堆栈并按下弹出项时,原始的
节点
对象将与其原始的
下一个
参考一起行驶

listOfInts -----> { 5 } -> { 3 } -> { 4 }
                    ^
newStack  -> { 8 } -+
这就是为什么整个列表出现在新堆栈上


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

谢谢您的建议!这更有意义。如果我可以问另一个问题的话,我编辑了push()方法,但是如上所述,当我将新对象添加到相同的
LinkedList
而不是形成一个列表时,似乎过度写入了以前的对象。有没有关于如何解决这个问题的建议?