Java 替换链表中的元素
我有一个被邀请参加聚会的客人的链接列表。我想换一位客人。为此,我在列表中搜索要删除的人,将其删除,然后将新的人添加到列表的前面 到目前为止,我的替换方法如下:Java 替换链表中的元素,java,linked-list,Java,Linked List,我有一个被邀请参加聚会的客人的链接列表。我想换一位客人。为此,我在列表中搜索要删除的人,将其删除,然后将新的人添加到列表的前面 到目前为止,我的替换方法如下: public void replace(String n, String rn, String rf){ boolean match = false; GuestNode curr = GuestList; GuestNode replace = new GuestNode(rn,rf); GuestNode onemor
public void replace(String n, String rn, String rf){
boolean match = false;
GuestNode curr = GuestList;
GuestNode replace = new GuestNode(rn,rf);
GuestNode onemore, twomore;
while (match == false && curr != null){
if (curr.getLink().getName().equals(n)){
onemore = curr.getLink();
twomore = onemore.getLink();
curr.setLink(twomore);
match = true;
}
else
curr = curr.getLink();
}
if (match){
GuestList = curr;
addNode(replace);
System.out.println(n+ " has been replaced with " +rn+ ".");
}
else
System.out.println(n+ " was not found.");
}
我的问题是,当我运行它时,我可以找到并删除原来的人,并将新的人添加到列表的前面,但它会不断丢失其余的人。以下是我得到的输出(用户输入以粗体显示):
请输入以下选项之一:排序、搜索、替换、删除、打印、退出打印 10人出席,他们喜欢10个冰淇淋。
9人出席,他们喜欢9个冰淇淋。
8人出席,他们喜欢8份冰淇淋。
7人出席,他们喜欢7个冰淇淋。
六个人参加,他们喜欢六个冰淇淋。
五个人出席,他们喜欢五个冰淇淋。
四个人出席,他们喜欢四个冰淇淋。
三人出席,他们喜欢三个冰淇淋。
两人出席,他们喜欢两个冰淇淋。
一个正在参加,他们喜欢一个冰淇淋 请输入以下选项之一:排序、搜索、替换、删除、打印、退出
更换 您想删除谁三个
你想让谁来代替他们,他们最喜欢的冰淇淋口味是什么?
三十三33
三个已被三十三个所取代 请输入以下选项之一:排序、搜索、替换、删除、打印、退出
打印 33人出席,他们喜欢33个冰淇淋。
四个人出席,他们喜欢四个冰淇淋。
两人出席,他们喜欢两个冰淇淋。
一个正在参加,他们喜欢一个冰淇淋 我已经处理这个问题好几个小时了,但我找不到错误在哪里。请帮忙 编辑:这是我的GuestNode的代码,以防出现问题
public class GuestNode{
private String name;
private String fav;
private GuestNode link;
public GuestNode(String n, String f){
this.name = n;
this.fav = f;
link = null;
}
public String toString(){
return this.name +" is attending, and they like "+ this.fav +" ice cream.";
}
public String getName(){ return this.name; }
public String getFav(){ return this.fav; }
public GuestNode getLink(){ return this.link; }
private void setName(String n){ this.name = n; }
private void setFav(String f){ this.fav = f; }
public void setLink(GuestNode l){ this.link = l; }
public void clear(){
this.link = null;
}
}
这里没有显示实际的节点代码,但这就是问题所在。您忽略了链表的工作方式 因为每个节点都链接到下一个节点,如果您只是删除一个节点,那么您也将删除该节点后面的所有节点,因为您不再有对这些节点的引用。每个节点仅存储下一个节点,仅此而已。所以没有任何东西指向其他节点 要从链接列表中正确删除节点,不仅必须删除该节点,还必须进入并更新该节点之前的节点,使其现在指向该节点之后的节点。你必须“修补”你创造的洞,重新连接链条 想象一下,一条长长的链条,你刚刚取下一个链环。如果不做任何其他操作,链条会分成两部分,两条分开的链条。要删除链接,必须将其前后的两个链接连接起来 A->B->C->D->E移除C A->B\uD->E两条链条!第二个丢失了,没有提到D 您需要对其进行修补,以确保结果是正确的
A->B->D->E此处未显示实际的节点代码,但这就是问题所在。您忽略了链表的工作方式 因为每个节点都链接到下一个节点,如果您只是删除一个节点,那么您也将删除该节点后面的所有节点,因为您不再有对这些节点的引用。每个节点仅存储下一个节点,仅此而已。所以没有任何东西指向其他节点 要从链接列表中正确删除节点,不仅必须删除该节点,还必须进入并更新该节点之前的节点,使其现在指向该节点之后的节点。你必须“修补”你创造的洞,重新连接链条 想象一下,一条长长的链条,你刚刚取下一个链环。如果不做任何其他操作,链条会分成两部分,两条分开的链条。要删除链接,必须将其前后的两个链接连接起来 A->B->C->D->E移除C A->B\uD->E两条链条!第二个丢失了,没有提到D 您需要对其进行修补,以确保结果是正确的
A->B->D->E假设
GuestList
是第一个节点,问题在于:
GuestList = curr;
这将通过将curr
作为列表的第一个节点来截断列表的开头
此外,请确保您的代码即使在特殊情况下也能正常工作(如果要替换第一个节点,会发生什么情况?假设
GuestList
是第一个节点,问题在于:
GuestList = curr;
这将通过将curr
作为列表的第一个节点来截断列表的开头
此外,请确保您的代码即使在特殊情况下也能正常工作(如果要替换第一个节点,会发生什么情况?我想您应该这样做:
curr.setLink(curr.getLink().getLink())我的教授不清楚他的指示,我想这就是他想要的。我尝试过更新旧客户机中的信息以使其成为新客户机,但我也无法做到这一点。我想您应该这样做:curr.setLink(curr.getLink().getLink())我的教授不清楚他的指示,我想这就是他想要的。我试着更新老客户中的信息,使之成为新客户,但我也无法做到这一点。我想这就是我在处理越来越多的临时客户节点时所做的。当前节点的链接现在将链接到twomore节点。我将添加我的节点代码,看看这是否是问题所在。添加到@Zaphod42提到的内容中,您的replace
函数并没有进行实际的替换。您正在删除一个节点,并在列表的开头添加新节点。这不是替代。您可能应该考虑替换存储在节点中的信息。