删除双列表上的方法而不返回正确的值

时间:2013-10-19 05:46:39

标签: java list methods linked-list

这是我的代码:

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变小了一个,并且检查变为true,但是一旦它返回它就不会返回任何东西。相反,它会返回循环,并继续前进,直到n为空。如果检查仍然为真,那就没问题,但是在它退出if语句而没有返回任何内容之后,它会将检查恢复为false,然后使整个方法返回false。我已经尝试删除返回和休息,这给了我相同的结果。我还尝试在运行调试器时没有返回或中断,这表明它保留在if语句中,就好像该语句是循环一样。

1 个答案:

答案 0 :(得分:0)

这是一个临时解决方案,但尝试在break之后添加n.mData == itemToRemove,然后返回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;
}