1. 程式人生 > >CS61b lab3 分享一個bug,足足找了一個多小時,希望各位別入坑哈

CS61b lab3 分享一個bug,足足找了一個多小時,希望各位別入坑哈

好的 log http 錯誤代碼 style obj item next slist

part1:

寫一個測試程序,比較簡單就不貼代碼啦,運行結果:

技術分享

part2:

改進InserEnd method,我是按照課上講的把原來的singlyList變成doubleList,在SListNode中多加入一個prev變量,修改後SListNode:

class SListNode {
  Object item;
  SListNode next;
  SListNode prev; 
  

  SListNode(Object obj) {
    item = obj;
    next = null;
    prev=null;
  }

 
  SListNode(Object obj, SListNode next,SListNode prev) {
    item 
= obj; this.next = next; this.prev=prev; } public void setNext(SListNode s){ this.next=s; } public void setPrev(SListNode s){ this.prev=s; } }

之後將原SList中的head變量作為一個

sentinel,修改後head.next為首項,head.prev為末項,不過在編寫SList的構造函數時一開始犯了一個錯誤:

錯誤代碼:

public SList() {
    size = 0;
    head 
= new SListNode(null,head,head); }

本來想著是初始化的時候就將head的next和prev均指向自己,不過在這裏head由於本來就是null,所以在未被創建出來的時候不能將其prev和next指向自己(我暫時是這樣理解的,各位要有更好的解釋給我說一下哈)由於這個bug還是能通過編譯器而且不拋出任何錯誤,所以最後找了好久才意識到233333

修改後代碼如下:

 public SList() {
    size = 0;
    head = new SListNode(null,null,null);
    head.setPrev(head);
    head.setNext(head);
  }

修改後的inserFront和insertEnd:

 public void insertFront(Object obj) {
    SListNode node=new SListNode(obj,head.next,head);
    head.next.setPrev(node);
    head.setNext(node);
    size++;
  }

  
  public void insertEnd(Object obj) {
    SListNode node=new SListNode(obj,head.prev,head);
    head.prev.setNext(node);
    head.setPrev(node);
    size++;
  }

其余方法調整下判定條件就行,代碼太多就不全貼了,最後運行結果:

技術分享

CS61b lab3 分享一個bug,足足找了一個多小時,希望各位別入坑哈