gpt4 book ai didi

java - 如何修复链接列表中的插入方法,以便第一个元素不会插入两次?

转载 作者:行者123 更新时间:2023-12-02 11:20:17 26 4
gpt4 key购买 nike

我正在使用链接列表编写具有多种功能的程序,其中之一是打印链接列表。当我打印链接列表时,由于某种原因,第一个元素被打印两次,表明它已被插入两次。这是我的插入方法:

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

请帮助我,我不知道可能出现什么问题。我尝试逐行删除插入方法中的代码,但仍然找不到问题。任何帮助将不胜感激。编辑:所以我尝试了建议的提示,但由于某种原因,现在我的程序无法读取我的输入。以下是与用户输入相关的方法:

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

这是我更新的插入方法,这是我更改的唯一内容:

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

您对第一个元素使用了两次 new ,这导致了重复插入。

您只需分配引用,而不是在 if 条件中创建新对象。

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

关于java - 如何修复链接列表中的插入方法,以便第一个元素不会插入两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49971303/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com