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

kri*_*ris 7 java stack linked-list

我有一个LinkedListNodes包含Integer对象.

LinkedList listOfInts = new LinkedList();
Run Code Online (Sandbox Code Playgroud)

我加上了Objects;

list.add(new Integer(8));
list.add(new Integer(5));
list.add(new Integer(3));
list.add(new Integer(4));
Run Code Online (Sandbox Code Playgroud)

使用以下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;
 }
}
Run Code Online (Sandbox Code Playgroud)

如果我这样做的话;

Node p = listOfInts.pop()
Run Code Online (Sandbox Code Playgroud)

然后打印数据,

System.out.println(p.getData());
Run Code Online (Sandbox Code Playgroud)

我得到了正确的答案:8.

但是,如果我想把这个数字推到一个新的LinkedList;

LinkedList newStack = new LinkedList();
newStack.push(p);
Run Code Online (Sandbox Code Playgroud)

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

 [8,5,3,4];
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么会这样?由于这是一个基本问题,我认为它与我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;
}
Run Code Online (Sandbox Code Playgroud)

编辑:建议用返回的对象而不是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
Run Code Online (Sandbox Code Playgroud)

rge*_*man 4

您的实现在调用时返回Node对象,但仍然具有对原始堆栈中“下一个”位置的引用。popNode

当您创建一个新堆栈并推送弹出的项目时,原始Node对象及其原始引用也会随之而来next

listOfInts -----> { 5 } -> { 3 } -> { 4 }
                    ^
newStack  -> { 8 } -+
Run Code Online (Sandbox Code Playgroud)

这就是整个列表出现在新堆栈上的原因。

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