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 楼答案
问题似乎在以下几行:
对于导致重复插入的第一个元素,您将使用new两次
您只需指定引用,而不是在if条件下创建新对象