代码之家  ›  专栏  ›  技术社区  ›  Dee

JAVA双链接列表-单元测试失败

  •  1
  • Dee  · 技术社区  · 12 年前

    我正在尝试单元测试我的 DSALinkedList ,但它是我的 removeFirst() 方法失败。我不明白为什么。有人能帮我吗?

    还是我在其他地方出了错 removeFirst() ? 请帮忙!!提前感谢您!

    这是我的 DSA链接列表

    public class DSALinkedList {
    
        public DSAListNode head;
        public DSAListNode tail;
        Object[] newValue;
    
    public DSALinkedList(){
        head = null;
        tail = null;
        }
    
    public void insertFirst(Object newValue){
        DSAListNode newNd;
        newNd = new DSAListNode(newValue);
        if (head == null) {
        head = newNd;
        tail = newNd;   
        }
        else{
        newNd.setNext(head);
        head = newNd;
        }
    }
    public void insertLast(Object newValue){
        DSAListNode newNd;
        newNd = new DSAListNode(newValue);
        if(head == null){
        head = newNd;
         }
        else {
        tail.next = newNd;
        tail = newNd;   
        }
    }
    
    public boolean isEmpty() {
         return (head == null);
     }
    
    public Object peekFirst(){
        Object nodeValue;
        if (head == null)
        throw new IllegalArgumentException("head is empty");
    
        else 
        nodeValue = head.getValue();
    
       return nodeValue;
    }
    
    public Object peekLast(){
        Object nodeValue;
        if (head == null)
        throw new IllegalArgumentException("head is empty");
        else
        nodeValue = tail.getValue();
        return nodeValue;
    }
    public Object removeFirst(){
       Object nodeValue;
        if (head == null)
        throw new IllegalArgumentException("head is empty");        
        else 
        nodeValue = head.getValue();
        head = head.getNext();
        return nodeValue;
    }
    }
    
    2 回复  |  直到 12 年前
        1
  •  0
  •   Daniel Qiu    12 年前

    我发现有两个地方没有处理@Chris提到的边缘案例,需要改进,请查看评论。

    public void insertLast(Object newValue) {
        DSAListNode newNd;
        newNd = new DSAListNode(newValue);
        if (head == null) {
            head = newNd;
            tail = newNd; // this should be added
        } else {
            tail.next = newNd;
            tail = newNd;
        }
    }
    

    并且:

    public Object removeFirst() {
        Object nodeValue;
        if (head == null) {
            throw new IllegalArgumentException("head is empty");
        } else {
            nodeValue = head.getValue();
        }
    
        head = head.getNext();
        // the following block should be added
        if (head == null) {
            tail = null;
        }
        return nodeValue;
    }
    
        2
  •  0
  •   Chris Cooper    12 年前

    首先删除时,有一个边情况(当head==tail时)需要同时更新head和tail。

    我怀疑您的单元测试在一次插入之后失败,然后从每一端连续删除一次。第二个请求应该引发异常,因为deque现在是空的。