【问题标题】:Remove method on the doubly list not returning the correct value双重列表上的删除方法未返回正确的值
【发布时间】:2013-10-19 05:46:39
【问题描述】:

这是我的代码:

public class RecipeBook {
private class Node {
    private Recipe mData;
    private Node mNext;
    private Node mPrev;
    public Node(Recipe data, Node next, Node prev) {
        mData = data;
        mNext = next;
        mPrev = prev;
    }
}

private Node mHead;
private Node mTail;
private int mCount;
public RecipeBook() {
}
public void add(Recipe itemToAdd) {
    Node newNode = new Node(itemToAdd, null, null);
    if (mHead == null)
        mHead = mTail = newNode;
    else {
        mTail.mNext = newNode;
        newNode.mPrev = mTail;
        mTail = newNode;
   }
   mCount++;
}
public int getCount() {
   return mCount;
}
public Recipe get(int index) {
   Node n = mHead;
   for (int i = 0; i < index; i++) {
   if (n == null)
       return null;
   n = n.mNext;
   }
   return n != null ? n.mData : null;
}
public boolean remove(Recipe itemToRemove) {
   Node n = mHead;
   boolean check = false;
   if (n == null) {
       check = false;
       return check;
   }
   while (n != null) {
     if (n.mData ==  itemToRemove) {
         if (n == mHead) {
             mHead = mHead.mNext;
             mHead.mPrev = null;
         }
         else if (n == mTail) {
             mTail = mTail.mPrev;
             mTail.mNext = null;
         }
         else {
            Node prev = n.mPrev;
            Node next = n.mNext;
            prev.mNext = next;
            next.mPrev = prev;
         }
         check = true;
         mCount--;
         return check;
     }
     else {
         n = n.mNext;
     }
   }
   return check;
}
public Recipe searchByName(String name) {
   for (int i = 0; i < this.getCount(); i++) {
       if (this.get(i).getName().equals(name))
           return this.get(i);
   }
    return null;
  }
public Recipe searchByIngredients(String target) {
   for (int i = 0; i < this.getCount(); i++) {
       if (this.get(i).hasIngredients(target) == true)
           return this.get(i);
   }
   return null;
}
}

我的问题出在 remove 方法上,实际上我已经用调试器检查过了。 while 循环工作正常,程序在n.mData == itemToRemove 时执行 if 语句。无论项目在列表中的哪个位置,它都会删除它应该删除的内容。此外,mCount 变小了,检查变为真,但是一旦它返回它就不会返回任何东西。相反,它会返回循环,并继续执行直到 n 为空。如果 check 保持为真,这会很好,但是在它退出 if 语句而不返回任何内容后,它将 check 恢复为 false,然后使整个方法返回 false。我尝试删除退货并休息,这给了我相同的结果。我还尝试在运行调试器时不返回也不中断,这表明它保留在 if 语句中,就好像该语句是一个循环一样。

【问题讨论】:

  • 1.不要太相信调试器。放入打印输出语句,看看会发生什么。 2. 使用 equals(),而不是 == 来比较对象。并确保由 Recipe 类实现。
  • 我打印了报表,不管我对我的列表做了什么,它总是返回 false。
  • 然后参见第 2 点。打印出与什么进行比较的内容

标签: java list methods linked-list


【解决方案1】:

这是一个临时解决方案,但尝试在 n.mData == itemToRemove 之后添加 break,然后返回 check。这应该能够为您提供一些提示,或许可以说明您的代码为何不起作用。

public boolean remove(Recipe itemToRemove) {
   Node n = mHead;
   boolean check = false;
   if (n == null) {
       check = false;
       return check;
   }
   while (n != null) {
     if (n.mData ==  itemToRemove) {
         if (n == mHead) {
             mHead = mHead.mNext;
             mHead.mPrev = null;
         }
         else if (n == mTail) {
             mTail = mTail.mPrev;
             mTail.mNext = null;
         }
         else {
            Node prev = n.mPrev;
            Node next = n.mNext;
            prev.mNext = next;
            next.mPrev = prev;
         }
         check = true;
         mCount--;
         break;
     }
     else {
         n = n.mNext;
     }
   }
   return check;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-22
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多