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();
}
}

京公网安备 11010502036488号