从单个链表java中删除String节点

时间:2015-01-25 01:28:47

标签: java string singly-linked-list

您好我正在学习单链表,而我正在使用Java书中的示例,我试图删除给定字符串值的节点。我已编码,但我没有删除任何东西,任何人都可以给我任何建议?我已经很沮丧,因为我不知道我做错了什么。感谢。

   public class LinkedStringLog implements StringLogInterface {
  protected LLStringNode log; // reference to first node of linked 
                              // list that holds the StringLog strings
  protected String name;      // name of this StringLog

  public LinkedStringLog(String name)
  // Instantiates and returns a reference to an empty StringLog object 
  // with name "name".
  {
    log = null;
    this.name = name;
  }
  public void remove(String element){
  LLStringNode currentNode;
  LLStringNode temporal;
  currentNode = log;
  temporal = currentNode.getLink();

  if(element.equalsIgnoreCase(currentNode.getInfo())){
      log = currentNode.getLink();

  } 

 while(currentNode!=null){
      if(element.equalsIgnoreCase(currentNode.getInfo())){
          temporal.setLink(currentNode.getLink());
      }
      else{
          currentNode.getLink();
          temporal = currentNode;
      }

  }

2 个答案:

答案 0 :(得分:0)

我猜您正在进入无限循环,因为您未在currentNode循环中更新while变量。

你可能想要这样的东西:

while(currentNode!=null){
      if(element.equalsIgnoreCase(currentNode.getInfo())){
          //don't you want to update the link of the node before currentNode here?
      }
      else{
          currentNode = temporal; //update currentNode variable
          temporal = currentNode.getLink(); //update temporal variable
      }

  }

答案 1 :(得分:0)

您似乎有许多错误。

其中一个主要问题是您在遍历链接列表时未能保留prevNode引用,因此您无法将列表中的所有项目链接在一起。

此外,您在哪里将log设置为链接列表的首项?

在任何情况下,此版本的remove可能效果更好(只要log实际上是非空的):

     public void remove(String element) {
         if (log == null) {
             return;
         }
         LLStringNode currentNode = log;
         LLStringNode prevNode = null;

         while (currentNode != null) {
             LLStringNode nextNode = currentNode.getLink();
             if (element.equalsIgnoreCase(currentNode.getInfo())) {
                 if (currentNode.equals(log)) {
                     log = nextNode;
                 }
                 if (prevNode != null) {
                     prevNode.setLink(nextNode);
                 }
             } else {
                 prevNode = currentNode;
             }
             currentNode = nextNode;
         }
     }