tags:

views:

125

answers:

4

So I'm learning Java and I want to implement a singly-linked list, but when I try to print it, it goes into an infinite loop, printing only the first element, as if the temp doesn't get reassigned. What's wrong here?

public class Cons
{
public int stuff;
public Cons next;

public Cons(int i)
{
  this(i, null);
}

public void show()
{
  Cons temp = this; 
  while(temp != null)
  {
    System.out.println(temp.stuff);
    temp = temp.next;
  }
}

public void push(int i)
{
  stuff = i;
  next = this;
}

  public static void main(String[] args)
  {
    Cons head = new Cons(2);
    head.push(3);
    head.push(12);
    head.show();
  }
}
+3  A: 

In this block:

public void push(int i)
{
  stuff = i;
  next = this;
}

You are assigning the node's next to itself.

Try this instead:

public void push(int i)
{
  next = new Cons(i);
}

That will remove the self-loop, but then you will still have the problem of remembering where the tail is. I will leave that as an exercise, since this is homework.

Another problem, pointed out in a comment, is that your code shouldn't compile as is, because you are attempting to call a constructor that doesn't exist.

If you want to call this(i, null) you need a constructor that takes (int, Cons) as its arugments.

danben
A: 

Try to create code as shown in wikipedia. You need Container to hold nodes, and Node to represent single node in list

MBO
A: 

I think

next = this

is wrong, you should instead create a new entry

next = new Cons(stuff);
stuff = i;

otherwise the next entry will point to the current one! Note that the order of the elements is reversed if you do it that way..

Tarnschaf
That will also put the values in the wrong places.
danben
A: 
public void push(int i)
{
  stuff = i;
  next = this; //here's the problem.
}

You need something like:

public void push(int i)
{
  Cons newnext = new Cons(i)
  tail.next = newnext;
  tail = newnext;
}

and of course you need a reference to the tail of your linked list somewhere.

Chad Okere