2011-10-07 113 views
0

嘿,我写了这个deleteNode()方法,如果我使用数字(int),但不会当我尝试传递一个字符串时工作。我打印出一个字符串[]名单的列表,我试图从列表中删除某个名字。当我输入名称时,它会打印“找不到节点”。就像我说的,如果我打印出一个数字列表,它的效果很好,但如果我改变并打印一个字符串,它不会。任何帮助表示赞赏。如何从链表中删除一个节点

public class BigNode { 


    public String dataitems; 
    public BigNode next; 
    BigNode front ; 

    public void initList(){ 
     front = null; 
    } 

    public BigNode makeNode(String number){ 
     BigNode newNode; 
     newNode = new BigNode(); 
     newNode.dataitems = number; 
     newNode.next = null; 
     return newNode; 
    } 

    public boolean isListEmpty(BigNode front){ 
     boolean balance; 
     if (front == null){ 
      balance = true; 
     } 
     else { 
      balance = false; 
     } 
     return balance; 

    } 

    public BigNode findTail(BigNode front) { 
     BigNode current; 
     current = front; 
     while(current.next != null){ 
      //System.out.print(current.dataitems); 
      current = current.next; 

     } //System.out.println(current.dataitems); 
     return current; 
    } 

    public void addNode(BigNode front ,String number){ 
     BigNode tail; 
     if(isListEmpty(front)){ 
      this.front = makeNode(number); 
     } 
     else { 
      tail = findTail(front); 
      tail.next = makeNode(number); 
     } 
    } 
    public void deleteNode(BigNode front, String value) { 
     BigNode curr, previous = null; boolean found; 

      if (!isListEmpty(front)){ 
       curr = front; 
       found = false; 

       while ((curr.next != null) && (!found)) { 
        if(curr.dataitems.equals(value)) { 
         found = true; 
        } 
        else { 
         previous = curr; 
         curr = curr.next; 
        } 
       } 
       if (!found) { 
        if(curr.dataitems.equals(value)) { 
         found = true; 
        } 
       } 
       if (found) { 
        if (curr.dataitems.equals(front.dataitems)){ // front.dataitems may be wrong .dataitems 
         front = curr.next; 
        } else { 

         previous.next = curr.next; 
        } 
       } else { 
        System.out.println("Node not found!"); 
        //curr.next = null; // Not sure If this is needed 
       } 
     } 
      showList(front); 
    } 




    public void printNodes(String[] len){ 


     int j; 
     for (j = 0; j < len.length; j++){ 

      addNode(front, len[j]); 
     } showList(front); 
    } 

    public void showList(BigNode front){ 
     BigNode current; 
     current = front; 
     while (current.next != null){ 
      System.out.print(current.dataitems + ", "); 
      current = current.next; 
     } 
     System.out.println(current.dataitems); 
    } 
    public static void main(String[] args) { 
        String[] names = {"Billy Joe", "Sally Mae", "Joe Blow", "Tasha Blue"}; 

     BigNode x = new BigNode(); 
        x.printNodes(names); 
        Scanner in = new Scanner(System.in); 
        String delete = in.next(); 
        x.deleteNode(x.front, delete); 
      } 

的String []名称= {1,名称2,名称3,名称4}

- 首先它打印列表,然后要求删除什么名字。

+0

确定继承人的大部分代码 – TMan

回答

3

编辑:好的,我发现了什么不对的,你已经发布的示例代码。

你打电话Scanner.next(),它读取单个。所有的节点值都是两字。所以如果我输入“Sally Mae”,它实际上是只是寻找“Sally”。

这与BigNode中的大部分代码无关(尽管这当然可以变得更加优雅)。基本上这样的:

String delete = in.next(); 

应该

String delete = in.nextLine(); 

现在我会强烈建议你只是更改代码,而是想想你可能已经确诊本作的方式你自己:

  • 将日志记录添加到您的代码中,以显示您正在查找的值以及您测试时的每个值
  • 使用调试器来遍历代码,观察变量
  • 使用单元测试来测试代码 - 这些代码不会向您显示问题(因为它不在代码中,您通常会编写测试)但他们会给你更大的信心,在测试代码中问题不是

如果您尝试这些方法中的一些或preferrably 所有,你将有更多的来自这个问题不仅仅是如何使用Scanner学到了很多东西......


在不同的地方,您使用==运算符比较字符串引用。如果您传入对列表中存在的实际字符串对象之一的引用,那么只会找到您的节点 - 而不是对等于字符串对象的引用。

你想要的东西,如:

if (curr.dataitems.equals(value)) 

(但仔细null检查)。

+0

这没有工作我仍然没有找到节点 – TMan

+0

@TMan:那么你需要发布一个简短的*完整*程序。例如,您仍然没有向我们展示BigNode的代码。 –

+0

好吧,我发布了必要的代码。你认为这可能是我传递我想删除的名字的方式? – TMan

0

您应该总是使用equals()来比较对象值,而不是==。例如,在你的这行代码:

curr.dataitems == value 

应该被写为:

curr.dataitems.equals(value) 
2

您应该使用String.equals比较而不是==比较。

if(curr.dataitems == value) { 

应该是:

if(curr.dataitems.equals(value) { 
1

你做的比较与==。对于int这比较的值,但String只有参考。所以你想要删除一个具有相同值的字符串,但是在不同的对象中这会失败。

改为使用String.equals()