CS61bproj1a

博客 动态
0 273
羽尘
羽尘 2022-03-13 18:56:29
悬赏:0 积分 收藏

CS61b proj1a

得分46.25
有一个点的bug不会修(希望大佬带我),style没有注意。
1.LinkedListDeque.java

public class LinkedListDeque <T>{    private  class staffnode{        private T item;        private staffnode pre;        private staffnode next;        private staffnode(T x) {            item=x;        }    }    private int size=1;    private staffnode first;    private staffnode last;    private staffnode standf;    private LinkedListDeque(T x) {        first=new staffnode(x);        standf=new staffnode(x);        first.next=standf;        first.pre=standf;        standf.next=first;        standf.pre=first;        last=first;        size=1;    }    public LinkedListDeque() {        standf=new staffnode(null);        first=standf;        last=first;        size=0;    }    public void addFirst(T x) {        if(size==0) {            first=new staffnode(x);            standf.next=first;            standf.pre=first;            first.pre=standf;            first.next=standf;            last.pre=standf;            last.next=standf;            last=first;            size++;        }        else {            size++;            if(size==2) {                last.pre=first;            }            staffnode first1=new staffnode(x);            standf.next=first1;            first1.next=first;            first1.pre=standf;            first.pre=first1;            first=first1;            first.pre=first1.pre;            first.next=first1.next;        }    }    public void addLast(T x) {        if(isEmpty()) {            last=new staffnode(x);            standf.pre=last;            standf.next=last;            last.next=standf;            last.pre=standf;            first=last;            first.next=standf;            first.pre=standf;            size++;        }        else {           staffnode v=last;            last=new staffnode(x);            last.pre=v;            v.next=last;            last.next=standf;            standf.pre=last;            size++;        }    }    public T removeFirst() {        if(size>=1) {            T e=first.item;            first=first.next;            standf.next=first;            size--;            return e;}        else            return null;    }    public T getRecursive(int index){        if (index>=size)            return null;        else            return getRecursive(first,index,0);    }    private  T getRecursive(staffnode p,int index,int t){        if(t==index) return p.item;        else {            return getRecursive(p.next,index,t+1);        }    }    public T removeLast() {        if(size>=1) {            T r=last.item;            last=last.pre;            last.next=standf;            size--;            return r;        }        else return null;    }    public boolean isEmpty() {        if(size==0) return true;        else return false;    }    public T get(int index) {        int t=0;        staffnode a=first;        while(a!=standf) {            if(index==t) return a.item;            a=a.next;            t++;        }        return null;    }    public void printDeque() {        staffnode p=first;        while(p!=standf) {            System.out.print(p.item);            System.out.print(" ");            p=p.next;        }        System.out.print("\n");    }    public int size() {        return size;    }}

 

 

 

2.ArrayDeque

 

public class ArrayDeque<T> {     private T[] items;     private int begin;     private int size;     private int last;     private double rate;     private int start;     private int s1;     private int s2;     private int end;     public ArrayDeque() {         items = (T[]) new Object[8];         begin=items.length-1;         size=0;         rate=0;         start=0;         last=0;         end=items.length;         s1=0;         s2=0;     }     public void addLast(T item) {        if(last<=begin&&last<items.length) {             items[last]=item;             size++;             last++;             rate=size/items.length;             s2++;         }         else {             T[] a = (T[]) new Object[items.length*2];             if(s2>0)                 System.arraycopy(items, start, a, 0,s2);             if(begin<items.length-1)                 System.arraycopy(items, begin+1, a, a.length-s1, s1);             items = a;             end=items.length;             start=0;             last=s2;             begin=items.length-s1-1;             items[last]=item;             last++;             size = size + 1;             s2++;         }    }     public  void addFirst(T item) {        if(begin>=0&&begin>=last) {             items[begin]=item;             begin--;             size++;             s1++;             rate=(double) size/items.length;         }         else {             T[] a = (T[]) new Object[items.length*2];             if(s2>0)                 System.arraycopy(items, start, a, 0, s2);             if(s1>0)                 System.arraycopy(items, begin+1, a, a.length-s1, s1);             items = a;             end=items.length;             begin=items.length-s1-1;             if(begin>=0&&begin<items.length)                 items[begin]=item;             begin--;             start=0;             last=s2;             size = size + 1;             rate=(double) size/items.length;             s1++;         }     }     private T d;     public T removeLast() {         if(s2>0) {             s2--;             size--;             last--;             d=items[last];             rate=(double) size/items.length;             if(rate<0.25&&items.length>16) {                 recycle();             }             return d;        }         else if(s1>0){             s1--;             end--;             size--;             d=items[end];             rate=(double) size/items.length;             if(rate<0.25&&items.length>16) {                 recycle();             }             return d;         }         else             return  null;     }     private int c;     public T removeFirst() {         if(s1>0) {             s1--;             size--;             begin++;             d=items[begin];             rate=(double) size/items.length;             if(rate<0.25&&items.length>16) {                 recycle();             }             return d;         }         else if(s2>0) {             s2--;             d=items[start];             start=start+1;             size--;             rate=(double) size/items.length;             if(rate<0.25&&items.length>16) {                 recycle();             }             return d;         }         else return  null;     }     private void recycle() {         if (size > 0) {             T[] a = (T[]) new Object[size];             if (s1 > 0)                 System.arraycopy(items, begin + 1, a, 0, s1);             if (s2 > 0)                 System.arraycopy(items, start, a, s1, s2);             items = a;             s2 = size;             s1 = 0;             begin = items.length - 1;             end = items.length;             start = 0;             last = s2;         }         else {             T[] a = (T[]) new Object[1];            //if(begin+1<=items.length-1)             if (s1 > 0)                 System.arraycopy(items, begin + 1, a, 0, s1);             if (s2 > 0)                 System.arraycopy(items, start, a, s1, s2);             items = a;             s2 = size;             s1 = 0;             begin = items.length - 1;             end = items.length;             start = 0;             last = s2;         }     }     public int size() {         return size;     }     public     T get(int index) {         if(index<s1)             return items[begin+index+1];         if(index>=s1&&index<size)             return  items[start+(index-s1)];         else return  null;     }    public void  printDeque() {        for(int i=begin+1;i<end;i++) {             System.out.print(items[i]);             System.out.print(' ');         }         for(int j=start;j<last;j++) {             System.out.print(items[j]);             System.out.print(' ');         }         System.out.print("\n");     }     public boolean isEmpty() {         return size==0;     }  }

 

 

我的失误点总结:
LinkList题目第一次没有注意给设置的pre赋值。每一次改变链表都要注意first,last以及他们之前、之后的节点的pre,next的变化。get递归写法要注意。
第二题总是忘记更新start,end的值只关心了begin和last。
在给addFirst()修改的时候也要对应修改addLast()。
remove函数同理,介于这不是简单的数组,get()函数不能简单采用数组常用的直接返回对应下标的值的办法,要判断index是在哪一部分。

 

 

posted @ 2022-03-13 18:36 爱吃土豆的小菜狗 阅读(0) 评论(0) 编辑 收藏 举报
回帖
    羽尘

    羽尘 (王者 段位)

    2335 积分 (2)粉丝 (11)源码

     

    温馨提示

    亦奇源码

    最新会员