【问题标题】:Replace element in Linked List替换链表中的元素
【发布时间】:2013-11-05 18:25:26
【问题描述】:

我有一个受邀参加聚会的客人的链接列表。我想用其他人代替其中一位客人。为此,我正在列表中搜索要删除的人,将其删除,然后将新人添加到列表的前面。

到目前为止,这是我的替换方法:

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 份冰淇淋。
九号参加,他们喜欢九号冰淇淋。
八是参加,他们喜欢 8 冰淇淋。
7 正在参加,他们喜欢 7 冰淇淋。
六个正在参加,他们喜欢 6 个冰淇淋。
五个正在参加,他们喜欢 5 个冰淇淋。
四人参加,他们喜欢 4 冰淇淋。
三个正在参加,他们喜欢 3 个冰淇淋。
有两个参加,他们喜欢 2 个冰淇淋。
一个正在参加,他们喜欢 1 个冰淇淋。

请输入以下选项之一:排序、搜索、替换、删除、打印、退出
替换

你想删除谁? 三个
你想让谁代替他们,他们最喜欢的冰淇淋口味是什么?
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;
    }
}

【问题讨论】:

  • 我想你想这样做:curr.setLink(curr.getLink().getLink());
  • 我的教授不清楚他的指示,我认为这就是他想要的。我尝试了一些更新旧访客中的信息以成为新访客,但我也无法让它工作。

标签: java linked-list


【解决方案1】:

假设GuestList是第一个节点,问题就出在这里:

GuestList = curr;

这会通过使curr 成为列表的第一个节点来截断列表的开头。

此外,请确保您的代码即使在特殊情况下也能正常工作(如果您想替换第一个节点会发生什么?)

【讨论】:

  • 听起来不错。我将 GuestList 分配给临时 curr,对 curr 进行更改,然后将其分配回来,所以我失去了那些我已经过去的人。但是,如果我将 curr 重新分配给 GuestList,我将丢失所做的更改。我应该直接对 GuestList 进行更改吗?我被教导将其分配给临时持有人,这样我就不会弄乱原始列表。
  • 您不必重新分配它。 GuestList 根本不能改变(除了极端情况),这就是为什么你使用 curr 来代替。
  • 对不起,我还是一头雾水。如果我正在使用 curr,并且我替换了我正在寻找的人,那么我如何确保将这些更改保留在原始 GuestList 中?
  • GuestList 实际上是您列表的第一个节点,它指向第二个节点等,直到您要删除的节点。因此,您已经在更改原始列表。 curr 不是您列表的副本,它是一个“手指”,首先指向第一个节点 (GuestList),然后继续前进,直到找到要删除的节点。
  • 啊!!现在我明白了,现在它可以正常工作了。非常感谢!
【解决方案2】:

此处未显示您的实际节点代码,但这就是问题所在。您疏忽了链表的工作方式。

因为每个节点都链接到下一个节点,如果您只是删除一个节点,您也将删除该节点后面的所有节点,因为您不再拥有对这些节点的引用。每个节点只存储下一个,仅此而已。所以没有任何东西指向其他节点。

要从链表中正确删除一个节点,您不仅必须删除该节点,还必须进入并更新该节点之前的节点,以现在指向该节点之后的节点。您必须“修补”您创建的孔,重新连接链条。

想象一条长链,而您刚刚取出了其中一个链环。如果你什么都不做,链条就会分成两部分,两条独立的链条。为了删除一个链接,你必须把它前面和后面的两个链接连接起来。

A -> B -> C -> D -> E 移除 C

A -> B _ D -> E 两条链子!第二个丢失了,没有提到 D。

你需要给它们打补丁,结果是

A -> B -> D -> E

【讨论】:

  • 我认为这就是我对 onemore 和 twomore 临时 GuestNodes 所做的事情。当前节点的链接现在将链接到 twomore 节点。我将添加我的节点代码,看看是否是问题所在。
  • 并添加到@Zaphod42 提到的您的replace 函数并没有进行实际替换。您正在删除一个节点并在列表的开头添加新节点。这不是替换。您可能应该考虑替换存储在要替换的节点中的信息
  • 我认为 alundy 已经用curr.setLink(twomore);“修补”了列表
  • 我想我没有看到我的方法是如何做到的。我的看法:A -> B -> C -> D curr = B onemore = C twomore = D curr.setLink(twomore); A -> B -> D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 2011-08-16
  • 2014-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多