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