自定义链表数据向后打印

时间:2014-01-10 01:05:45

标签: java data-structures

我刚创建了自定义节点类并创建了一个链表,但是当我在列表中打印数据时,数据会向后打印。我以为我设置了指针并在列表的开头添加了新节点。但显然编译器认为不然。我花了一段时间才最终理解指针,但我想我并没有像我想的那样理解。

public class Node {

public String data;
public String cat; 
public Node next; 

public Node (String data, String cat, Node next){
    this.data=data; 
    this.cat=cat; 
    this.next=next; 
}

public Node() {

}
public String toString()
{
    return "Patient: " + data + "   Category: " +cat ; 
}

}


public class Main {

public static Node head; 
public static void main (String args [])
{
    add("P1" , "2"); 
    add("P2", "3"); 
    add("P3", "4"); 
    add("P4", "4"); 
printList(); 
}

// add data to nodes

public  static void add(String d, String c)
{
    Node temp = null; 

    if (head == null)
    {
        head = new Node(d, c, null); 
    }
    else
    {
        temp=head; 
        head= new Node(d, c, temp); 
    }

}
// print node data

public static void printList()
{
    while (head != null)
    {
        System.out.println(head); 
        head=head.next;      
    }
}

}

3 个答案:

答案 0 :(得分:0)

您的列表向后打印,因为后面创建的节点放在列表的头部而不是后面。即。

head -> Node1

变为

head -> Node2 -> Node1

然后

head -> Node3 -> Node2 -> Node1

您在printList中的迭代是可以的。在add中,您需要找到最后一个NodeNodenext)而不是将新null放在首位那里有新的Node。即。

head -> Node1

变为

head -> Node1 -> Node2

将您的else(当列表不为空时)更改为:

else
{
    temp = head;
    // Get last item
    while (temp.next != null)
    {
        temp = temp.next;
    }
    // Point old last item to *new* last item
    temp.next = new Node(d, c, null); 
}

答案 1 :(得分:0)

rgettman是正确的,当您将元素添加到您在第一个位置添加的链接列表

//element1->null
//add(element2)
//element2->element1->null

你可以做一个迭代搜索null并插入最后一个位置,就像这样

public  static void add(String d, String c)
{
    Node temp = null; 

    if (head == null)
    {
        head = new Node(d, c, null); 
    }
    else
    { 
        temp=head;
        while(temp!=null){ //search last element
            temp=temp.next();
        }
        temp.next= new Node(d, c, null); //the new element it's after the last
    }

}

你也可以创建一个名为Node lastNode的变量,并在这里保存最后一个节点,这样做你不必循环,更有效的算法。类似的东西:

public class Node {
    public Node lastNode;
...
}

并在主类......

public  static void add(String d, String c)

{
    Node temp = null; 

    if (head == null)
    {
        head = new Node(d, c, null); 
        lastNode=head;
    }
    else
    { 
        Node newnode= new Node(d,c,null);
        lastNode.next=newnode;
        lastNode= newnode;
    }

}

答案 2 :(得分:0)

您所描述的行为实际上确实是LinkedList的工作方式。就像rgettman指出的那样,当你在LinkedList上使用add方法时,你会添加到列表的头部。问题是,当您通过设置head = head.next从LinkedList中删除时,您也会从头部删除。

如果仍然不清楚,请查看此动画:http://www.cs.usfca.edu/~galles/visualization/StackLL.html尝试将几个整数推入堆栈,然后弹出它们。这就是您的链接列表的工作方式。

解决这个问题的一种方法是将所有值粘在一起,以便在打印之前将它们整理好。

public static void printList()
{
    String toPrint = "";
    while (head != null)
    {
        toPrint = head + "\n" + toPrint; 
        head = head.next;      
    }
    System.out.println(toPrint);
}