复制链接列表中的节点java

时间:2015-11-16 02:02:43

标签: java duplicates nodes singly-linked-list

刚开始,这是家庭作业,谢谢你提前给予的帮助。我一直陷入小问题,所以我希望你们可以帮助我。我想要做的是创建一个具有多个函数的链表。我遇到麻烦的就是排序(我可以做其他的)。每个节点都包含一个字符串,一个整数和一个double。我需要能够根据用户的要求按照这些中的每一个和输入的顺序进行排序。 ***同样重要的是要提到我的对象中的变量是私有的,我的对象称为list1。基本上,我必须为时间顺序制作一个链表,为每个其他顺序制作一个链表。

我的计划是在用户输入节点时以正确的顺序插入节点。因此,当用户输入节点时,该节点需要在时间顺序列表和其他列表中的正确位置。所以,我需要复制节点来执行此操作。但是,我不能简单地说

icopy(copy for integer) = newNode(node the user just inputted)

只会更改地址。当我去找我的导师时,他告诉我应该说:

    icopy.data = newNode.data;

(“数据”是提到我需要获取节点内各个数据类型的快捷方式。)所以我写道:

    icopy.GetI() = newNode.GetI();  

当我这样做时,我遇到了这个错误:需要意外类型:变量,找到:值。我不知道该怎么做。任何帮助将不胜感激,我很乐意澄清任何事情。

* GetI:我的对象中的方法,可以访问每个节点中的整数值 * p:按时间顺序的指针 * pi:整数的指针 * fi:整数链表的前面

  public static void main(String args[])
  {
    String repeat = "y";
    boolean inserted = false;
    list1 fChr = null;
    list1 p = fChr;
    list1 icopy = null;
    list1 scopy = null;
    list1 dcopy = null;
    list1 fd = fChr;//front of the double list
    list1 fi = null;//front of the integer list
    list1 fStr = fChr;//front of the string list~
    while(repeat.equals("y"))//while the user agrees to adding a new node
    {
        if(fChr == null)// if the front is empty
        {
            fChr = new list1();//create a new node by calling object and sets it as the front
        }
        else
        {
            p = fChr;
            while(p.next != null)//finds the end of the Linked list
            {
                p = p.next;//moves the pointer p down the list
            }
            list1 newNode = new list1();
            icopy.GetI() = newNode.GetI();// make a copy of newNode
            p.next = nexNode;//put in chronological order
            while(p != null)
            {
                if(fi == null)
                {
                    fi = n;
                }
                else if(n.GetI() < fi.GetI)//check at beginning
                {
                    //put at beginning
                }                    

                else if(icopy.GetI() < p.next.GetI())//check in between nodes
                {
                    //put in between
                }
                //does it go at the end
            }
        }
        repeat = JOptionPane.showInputDialog("Would you like to add a node [y/n]");
    }
    PrintMenu(fChr, fi, fd, fStr);// sends the user to the menu screen
}

1 个答案:

答案 0 :(得分:0)

这里有一些你不理解的东西。首先,在Java中iCopy.getI() = ...毫无意义。当方法返回值时,如果要更改它,则需要将其分配给变量。如果要更改实例变量,则需要一个名为iCopy.setI()的单独方法。

听起来好像你并没有在排序方面寻求帮助,所以我会限制我创建列表副本的答案。

您的教授所了解的是,确保数据在您的多个链接列表中一致的最简单方法是将存储数据的类与列表的节点分开。所以我希望你的类结构最终看起来像:

class Data {
    private final int intValue;
    private final String strValue;
    private final double doubleValue;
}

class Node {
    private final Data data;
    private Node next;

    public Node(Data data) {
        this.data = data;
        this.next = null;
    }
}

现在,如果要创建一个与旧数据库相同的新链接列表,则可以向Node添加一个构造函数,以创建对原始数据的引用:

class Node {
    public Node copy() {
        Node copy = new Node(data);
        if (next != null)
            copy.next = next.copy();
        return copy;
    }
}

希望您能看到它的作用:它创建一个引用与此数据相同的数据的新节点,然后使用递归来复制列表的其余部分。

现在创建每个排序顺序可能如下所示:

Node listByInt = list.copy();
/* code to sort listByInt according to data.intValue */

如果您想要一些关于排序的提示,请添加注释,但我建议您在尝试之前将代码设置为具有相同的列表副本。

作为最后一点,您不一定需要单独的链接列表来解决此问题。另一种方法是将原始插入顺序存储在节点中。然后,您可以在打印列表之前按任何顺序(包括原始插入顺序)进行排序。就个人而言,除非存在性能问题(例如,您需要多次使用每个已排序的列表),否则我更倾向于将其作为解决方案。