单链表的结点定义:
package 数据结构;
//定义单链表的数据类型,存储数据以int型为例
public class Slinklist {
private int data;
private Slinklist next=null;
public Slinklist(int data,Slinklist next){
this.data=data;
this.next=next;
}
public void setData(int data){
this.data=data;
}
public int getData(){
return data;
}
public void setNext(Slinklist next) {
this.next=next;
}
public Slinklist getNext(){
return next;
}
}
自定义越界异常:
package 数据结构;
//运行时异常是编译器无法检测的
public class OutofBoundaryException extends RuntimeException{
public OutofBoundaryException(String str){
super(str);
}
}
线性表的单链表表示:
package 数据结构;
import java.util.IllegalFormatCodePointException;
public class Xianxingbiao {
public int size;
public Slinklist head;
//辅助方法1:获取元素e的前驱节点:
public Slinklist getPre(int e){
Slinklist p=head;
while (p.getNext()!=null)
if(p.getNext().getData()==e) return p;
p=p.getNext();
return null;
}
//辅助方法2:获取位置i元素的前驱节点
public Slinklist getIndexPre(int i){
Slinklist p=head;
while (i--!=0) p=p.getNext();
return p;
}
//返回线性表大小
public int getSize(){
return size;
}
//判断线性表是否为空
public boolean isEmpty(){
return size==0;
}
//判断线性表是否包含元素e
public boolean isContain(int e){
Slinklist p=head.getNext();
while(p!=null)
if (p.getData()==e) return true;
p=p.getNext();
return false;
}
//返回元素e的位置
public int indexOf(int e){
//先判断元素e是否包含在链式线性表中
int index=0;
while(isContain(e)){
Slinklist p=head.getNext();
while(p!=null)
if (p.getData()==e) return index;
else {p=p.getNext();
index++;}
}
//输出位置为-1表示该线性表中不包含该元素
return -1;
}
//将元素e插入i位置
public void insertIndex(int e,int i) throws OutofBoundaryException{
//判断i是否在合规
if (i>size||i<0) throw new OutofBoundaryException("索引越界");
Slinklist n=getIndexPre(i);
//定义新的链表节点用来存储数据e
Slinklist m=new Slinklist(e, n.getNext());
n.setNext(m);
}
//将元素e放在元素p之前
public void insertBefore(int e,int p) throws OutofBoundaryException{
if(!isContain(p)) throw new OutofBoundaryException("线性表中不存在元素e");
Slinklist q=getPre(p);
Slinklist m=new Slinklist(e, q.getNext());
q.setNext(m);
}
//将元素e放在元素p之后
public void insertAfter(int e,int p) throws OutofBoundaryException{
if(!isContain(p)) throw new OutofBoundaryException("线性表中不存在元素e");
Slinklist m=head.getNext();
while (m!=null){
if (m.getData()!=p) m=m.getNext();
Slinklist n=new Slinklist(e, m.getNext());
m.setNext(n);
}
}
//删除下标为i的元素
public void rmIndex(int i) throws OutofBoundaryException{
//第一个元素的index是0,最后一个元素的下标是size-1;
if(i>=size||i<0) throw new OutofBoundaryException("索引越界了");
Slinklist p=head.getNext();
Slinklist m=head;
while(i--==0)
p=p.getNext();
m=m.getNext();
m.setNext(p.getNext());
}
//删除元素e,代码展示删除第一个值为m的结点
public void rmEle(int e) throws OutofBoundaryException{
if(!isContain(e))throw new OutofBoundaryException("线性表中不存在元素e");
//调用之前定义的方法获取元素e的索引
int i =indexOf(e);
//调用之前的方法,删除索引为i的元素
rmIndex(i);
}
//获取下标为i的元素
public Slinklist getIndex(int i) throws OutofBoundaryException{
if(i>=size||i<0) throw new OutofBoundaryException("索引越界了");
Slinklist p=head.getNext();
while (i -- !=0) p=p.getNext();
return p;
}
//将下标为i的元素替换为e
public void exChange(int e,int i){
if(i>=size||i<0) throw new OutofBoundaryException("索引越界了");
Slinklist m=getIndex(i);
m.setData(e);
}
//线性表添加元素e
public void addEle(int e){
Slinklist m=new Slinklist(e, null);
Slinklist p=head;
while(p.getNext()!=null) p=p.getNext();
p.setNext(m);
}
}