我有一个被邀请参加聚会的客人的链接列表。我想用其他人替换其中一位客人。为此,我在列表中搜索要删除,删除它以及将新人添加到列表前面的列表。
到目前为止,这是我的替换方法:
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个冰淇淋 九人正在参加,他们喜欢9个冰淇淋 八人正在参加,他们喜欢8个冰淇淋 七人正在参加,他们喜欢7个冰淇淋 六人正在参加,他们喜欢6个冰淇淋 五个人正在参加,他们喜欢5个冰淇淋 四个人参加,他们喜欢4个冰淇淋 三人参加,他们喜欢3个冰淇淋 两个人参加,他们喜欢2个冰淇淋 一个人参加,他们喜欢1个冰淇淋。
打印请输入以下选项之一:排序,搜索,替换,删除,打印,退出
替换你想删除谁?的 3
你想把谁放在他们的位置,他们最喜欢的冰淇淋味道是什么? THIRTYTHREE 33
三个已被THIRTYTHREE取代。请输入以下选项之一:排序,搜索,替换,删除,打印,退出
打印THIRTYTHREE正在参加,他们喜欢33种冰淇淋 四个人参加,他们喜欢4个冰淇淋 两个人参加,他们喜欢2个冰淇淋 一个人参加,他们喜欢1个冰淇淋。
我现在已经处理了几个小时了,我找不到错误的地方。请帮忙!
编辑:这是我的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;
}
}
答案 0 :(得分:2)
此处未显示您的实际节点代码,但这就是问题所在。你已经对链表如何运作进行了疏忽。
由于每个节点都链接到下一个节点,如果您只是删除一个节点,那么您还要删除该节点后面的所有节点,因为您不再具有对这些节点的引用。每个节点只存储下一个节点,仅此而已。所以没有任何东西指向那些其他节点。
要正确删除链接列表中的节点,您不仅必须删除该节点,还必须进入并更新该节点之前的节点,现在指向该节点之后的节点。你必须“修补”你创建的洞,重新连接链。
想象一个长链,你刚刚取出其中一个链接。如果你什么也不做,链条分为两部分,两条独立的链子。要删除链接,您必须加入前面和后面的两个链接。
A - > B - > C - > D - > E删除C
A - > B _ D - > E两个链!第二个丢失了,没有提到D。
你需要修补它们,结果是
A - > B - > D - > ë
答案 1 :(得分:2)
假设GuestList
是第一个节点,问题在于:
GuestList = curr;
这会使curr
成为列表的第一个节点,从而截断列表的开头。
另外,请确保您的代码即使在特殊情况下也能正常工作(如果您想要替换第一个节点会发生什么?)