有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何修复链表中的insert方法,使第一个元素不会被插入两次?

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

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

下面是一些可能与问题相关的其他方法,例如我的readData方法和打印列表的方法:

public void readData(SinglyLinkedList<Item> list)
    {
        FileInput inFile;

        String fileName = "file20.txt";
        int id, inv;

        inFile = new FileInput(fileName);

        int howMany = inFile.readInt();
        for (int k = 1; k <= howMany; k++)
        {
            id = inFile.readInt();
            inv = inFile.readInt();
            list.insert(new Item(id, inv));
        }
    }
 /**
     *  Print the contents of the entire linked list
     */
    public void printList()
    {
        ListNode temp = first;
        while (temp != null)
        {
            System.out.println(temp.getValue() + " ");
            temp = temp.getNext();// go to next node
        }
        System.out.println();
    }

以下是正在读取的文本文件:

20
       196        60
     18618        64
      2370        65
     18410        56
     18465        27
     19967        45
     17911        96
       184        14
     18871        69
     14088        92
     18061         3
       206        31
     13066         8
     12705        14
     15917        51
     15814        60
     15320        82
      8303        90
      7282        73
     12328        63

这就产生了目前的结果:

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 static void main(String[] args)
    {
        OrderedList test = new OrderedList();
        SinglyLinkedList<Item> list = new SinglyLinkedList<Item>();

        test.mainMenu (list);
    }

这是我更新的insert方法,这是我唯一更改的:

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

共 (1) 个答案

  1. # 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 ;
            }