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++; }
其余方法调整下判定条件就行,代码太多就不全贴了,最后运行结果: