Stack Implementation for Nodes containing Objects

I have a LinkedList of Nodes that contain Integer Objects.

LinkedList listOfInts = new LinkedList();

And I add the Objects ;

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

with the following Node class:

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;
 }
}

If I do something as such;

Node p = listOfInts.pop()

And then print the data,

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

I get the right answer: 8.

But if I want to push this number onto a new LinkedList ;

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

It pushes the entire listOfInts, not just the first data point, 8.

 [8,5,3,4];

My question is why this happens? Since this is such a basic problem, I assume it has to do with my push() and pop() methods, but since I wrote them similar to ones I've seen in textbooks, I don't know what's wrong with them. Could anyone help me understand?

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;
}

EDIT: Did as suggested with returning Objects instead of Nodes , and code is more or less the same except for push() method. So, when I try to add another object to the same LinkedList , it replaces the old one instead of adding to the list.

 //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

Your implementation is returning the Node object when pop is called, but the Node still has a reference to the "next" position within the original stack.

When you create a new stack, and you push the popped item, the original Node object is along for the ride, with its original next reference.

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

That is why the whole list appears on the new stack.

The solution is not to expose the Node object at all. Instead of accepting a Node in push , accept the data item, and create your own Node . Instead of returning a Node in pop and peek , extract the data item from the Node and return it. This way you don't inadvertently risk leaking the reference to the next Node in the desired node.

链接地址: http://www.djcxy.com/p/87094.html

上一篇: 如何使用ResourceTestRule在单元测试中打开跟踪?

下一篇: 包含对象的节点的堆栈实现