Java 如何修复链接列表中的insert方法,使第一个元素不是';你不能插两次吗?

Java 如何修复链接列表中的insert方法,使第一个元素不是';你不能插两次吗?,java,linked-list,Java,Linked List,我正在使用链表编写一个具有多个函数的程序,其中一个是打印链表。当我打印我的链表时,由于某种原因,第一个元素被打印两次,表示它被插入了两次。以下是我的插入方法: public void insert(E element) { Comparable<E> elemC = (Comparable<E>) element; ListNode new_node = new ListNode(elemC); if(first =

我正在使用链表编写一个具有多个函数的程序,其中一个是打印链表。当我打印我的链表时,由于某种原因,第一个元素被打印两次,表示它被插入了两次。以下是我的插入方法:

public void insert(E element)
    {
        Comparable<E> elemC = (Comparable<E>) element;
        ListNode new_node = new ListNode(elemC);
        if(first == null)
        {
            first = new ListNode(elemC);
        }
        ListNode last = first;
        while(last.next != null)
        {
            last = last.next;
        }
        last.next = new_node;
    }
这就产生了目前的结果:

Id=196,Inv=60 
Id=196,Inv=60 
Id=18618,Inv=64 
Id=2370,Inv=65 
Id=18410,Inv=56 
Id=18465,Inv=27 
Id=19967,Inv=45 
Id=17911,Inv=96 
Id=184,Inv=14 
Id=18871,Inv=69 
Id=14088,Inv=92 
Id=18061,Inv=3 
Id=206,Inv=31 
Id=13066,Inv=8 
Id=12705,Inv=14 
Id=15917,Inv=51 
Id=15814,Inv=60 
Id=15320,Inv=82 
Id=8303,Inv=90 
Id=7282,Inv=73 
Id=12328,Inv=63 
请帮帮我,我不知道有什么问题。我已尝试逐行删除insert方法中的代码,但仍然找不到问题所在。任何帮助都将不胜感激。 编辑:所以我尝试了建议的技巧,但由于某种原因,现在我的程序无法读取我的输入。以下是与用户输入关联的方法:

public void mainMenu (SinglyLinkedList<Item> head)
    {
        String choice;
        ConsoleIO console = new ConsoleIO();
        do
        {
            System.out.println("Linked List algorithm menu\n");
            System.out.println("(1) Read data from disk");
            System.out.println("(2) Print ordered list");
            System.out.println("(3) Search list");
            System.out.println("(4) Delete from list");
            System.out.println("(5) Clear entire list");
            System.out.println("(6) Count nodes in list");
            System.out.println("(7) Print list backwards");
            System.out.println("(Q) Quit\n");
            System.out.print("Choice ---> ");
            choice = console.readLine();  // kludge to ensure choice.charAt(0) > 0

            System.out.println();

            if ('1' <= choice.charAt(0) && choice.charAt(0) <= '7')
            {
                switch (choice.charAt(0))
                {
                    case '1' :
                    readData(head);
                    break;
                    case '2' :
                    System.out.println();
                    System.out.println("The tree printed inorder\n");
                    head.printList();
                    System.out.println();
                    break;
                    case '3' :
                    testFind(head);
                    break;
                    case '4' :
                    testDelete(head);
                    break;
                    case '5' :
                    head.clear();
                    break;
                    case '6' :
                    System.out.println("Number of nodes = " + head.size ());
                    System.out.println();
                    break;
                    case '7' :
                    head.printBackwards();
                    break;
                }
            }
        }
        while (choice.charAt(0) != 'Q' && choice.charAt(0) != 'q');
    }
public void主菜单(单链接列表头)
{
字符串选择;
ConsoleIO console=新ConsoleIO();
做
{
System.out.println(“链表算法菜单”);
System.out.println(“(1)从磁盘读取数据”);
System.out.println(“(2)打印订单列表”);
System.out.println(“(3)搜索列表”);
System.out.println(“(4)从列表中删除”);
System.out.println(“(5)清除整个列表”);
System.out.println(“(6)在列表中计数节点”);
System.out.println(“(7)向后打印列表”);
System.out.println(“(Q)Quit\n”);
System.out.print(“选择-->”;
choice=console.readLine();//确保choice.charAt(0)>0的kludge
System.out.println();

如果('1'问题似乎在以下几行:

 ListNode new_node = new ListNode(elemC);
        if(first == null)
        {
            first = new ListNode(elemC);
        }
对于导致重复插入的第一个元素,您将使用new两次

您只需指定引用,而不是在if条件下创建新对象

 ListNode new_node = new ListNode(elemC);
        if(first == null)
        {
            first = new_node ;
        }

我接受了你的建议,但我不确定它是否有效。如果不太麻烦的话,你能看一下我的编辑吗?在分配给
第一个
后,没有理由继续执行函数的其余部分。如果这样做,实际上是在函数的最后一行再次插入相同的节点。在分配给
第一行后尝试返回t
,看看这是否有帮助。我爱你。非常感谢你的工作。不客气!如果你不确定为什么这样做有效,请尝试在一张纸上画出来,逐行遍历代码,看看为什么要插入节点两次。
public static void main(String[] args)
    {
        OrderedList test = new OrderedList();
        SinglyLinkedList<Item> list = new SinglyLinkedList<Item>();

        test.mainMenu (list);
    }
public void insert(E element)
    {
        Comparable<E> elemC = (Comparable<E>) element;
        ListNode new_node = new ListNode(elemC);
        if(first == null)
        {
            first = new_node;
        }
        ListNode last = first;
        while(last.next != null)
        {
            last = last.next;
        }
        last.next = new_node;
    }
 ListNode new_node = new ListNode(elemC);
        if(first == null)
        {
            first = new ListNode(elemC);
        }
 ListNode new_node = new ListNode(elemC);
        if(first == null)
        {
            first = new_node ;
        }