Java数据结构-单链表
List.java
package com.linearlist; public interface List { public int getSize(); public boolean isEmpty(); public boolean contains(Object e); public int indexOf(Object e); public void insert(int i, Object e) throws OutOfBoundaryException; public boolean insertBefore(Object obj, Object e); public boolean insertAfter(Object obj, Object e); public Object remove(int i) throws OutOfBoundaryException; public boolean remove(Object e); public Object replace(int i, Object e) throws OutOfBoundaryException; public Object get(int i) throws OutOfBoundaryException; }
Node.java
package com.linearlist; public interface Node { public Object getData(); public void setData(Object obj); }
SLNode.java
package com.linearlist; public class SLNode implements Node{ private Object element; private SLNode next; public SLNode(){ this(null, null); } public SLNode(Object elem, SLNode next){ this.element = elem; this.next = next; } public SLNode getNext(){ return next; } public void setNext(SLNode next){ this.next = next; } // 方法重写 public Object getData(){ return element; } public void setData(Object obj){ element = obj; } }
ListSLinked.java
package com.linearlist; public class ListSLinked implements List{ private Strategy strategy; private SLNode head; private int size; public ListSLinked(){ // 默认比较策略 } public ListSLinked(Strategy strategy){ this.strategy = strategy; head = new SLNode(); size = 0; } //--------------------新增方法--------------------------- // 获取数据元素 e 所在结点的前驱结点 private SLNode getPreNode(Object e){ SLNode p = head; while(p.getNext()!=null) if(strategy.equal(p.getNext().getData(), e)) return p; else p = p.getNext(); return null; } // 获取序号为 0<=i<size 的元素所在结点的前驱结点 private SLNode getPreNode(int i){ SLNode p = head; for(int j=0; j<i; j++) p = p.getNext(); return p; } //--------------------方法重写--------------------------- public int getSize() { return size; } public boolean isEmpty() { return size == 0; } public boolean contains(Object e) { SLNode p = head.getNext(); while (p != null){ if(strategy.equal(p.getData(), e)) return true; else p = p.getNext(); } return false; } public int indexOf(Object e) { SLNode p = head.getNext(); int index = 0; while (p!=null){ if(strategy.equal(p.getData(), e)) return index; else {index++; p=p.getNext();} } return -1; } public void insert(int i, Object e) throws OutOfBoundaryException { if (i<0||i>size) throw new OutOfBoundaryException("错误,指定的插入序号越界。"); SLNode p = getPreNode(i); SLNode q = new SLNode(e, p.getNext()); p.setNext(q); size++; } public boolean insertBefore(Object obj, Object e) { SLNode p = getPreNode(obj); if(p!=null){ SLNode q= new SLNode(e, p.getNext()); p.setNext(q); size++; return true; } return false; } public boolean insertAfter(Object obj, Object e) { SLNode p = head.getNext(); while (p!=null){ if(strategy.equal(p.getData(), obj)){ SLNode q = new SLNode(e, p.getNext()); p.setNext(q); size++; return true; } else p = p.getNext(); } return false; } public Object remove(int i) throws OutOfBoundaryException { if (i<0||i>size) throw new OutOfBoundaryException("错误,指定的插入序号越界。"); SLNode p = getPreNode(i); Object obj = p.getNext().getData(); p.setNext(p.getNext().getNext()); size--; return obj; } public boolean remove(Object e) { SLNode p = getPreNode(e); if(p!=null){ SLNode q = new SLNode(e, p.getNext()); p.setNext(q); size++; return true; } else return false; } public Object replace(int i, Object e) throws OutOfBoundaryException { if (i<0||i>size) throw new OutOfBoundaryException("错误,指定的插入序号越界。"); SLNode p = getPreNode(i).getNext(); Object obj = p.getData(); p.setData(e); return obj; } public Object get(int i) throws OutOfBoundaryException { if (i<0||i>size) throw new OutOfBoundaryException("错误,指定的插入序号越界。"); SLNode p = getPreNode(i).getNext(); return p.getData(); } }