数据结构之链表Java实现

来源:互联网 发布:淘宝尼维杰电视机 编辑:程序博客网 时间:2024/05/01 10:45

接口:

package linearList;import org.omg.CORBA.OBJ_ADAPTER;public interface ILiist {public void clear();// 置空表public boolean isEmpty();// 是否为空public int length();// 数据元素个数public Object get(int i) throws Exception;// 返回第i个数据元素的值public void insert(int i, Object x) throws Exception;// 在第i个数据元素之前插入一个值为x的数据元素public void remove(int i) throws Exception;//删除并返回第i个元素public int indexOf(Object x);//返回首次出现指定的数据元素的位序号,                             //若线性表不包含此数据元素,则返回-1public void display();//输出}


结点类;

package linearList;public class Node {//结点类public Object data;//存放节点值public Node next;//后继节点的引用//无参数时的构造函数public Node(){this(null,null);}//带一个参数时的构造函数public Node(Object data){this(data,null);}//带两个参数时的构造函数public Node(Object data,Node next){this.data=data;this.next=next;}}

具体实现:

package linearList;import java.util.Scanner;import sun.reflect.generics.tree.VoidDescriptor;public class LinkList implements ILiist{public Node head;//单链表的头指针public LinkList(){//单链表的构造函数head=new Node();//初始化头结点}//构造一个长度为n的单链表public LinkList(int n,boolean Order)throws Exception{this();//初始化头结点if(Order){create1(n);//尾插入方法顺序建立单链表}else{create2(n);//头插入方法逆位序建立单链表}}//尾插入方法顺序建立单链表,n为单链表的结点个数public void create1(int n)throws Exception{Scanner sc=new Scanner(System.in);for(int j=0;j<n;j++){//逆序输入n个结点的数据域值insert(length(), sc.next());//生成新结点,插入到表尾}}//头插入方法逆位序建立单链表,n为单链表的结点个数public void create2(int n)throws Exception{Scanner sc=new Scanner(System.in);for(int j=0;j<n;j++){//逆序输入n个结点的数据域值insert(0, sc.next());//生成新结点,插入到表头}}//将一个已经存在的带头结点的单链表置成为空表public void clear(){head.data=null;head.next=null;}//判断带头结点的单链表是否为空public boolean isEmpty(){return head.next==null;}//求带头结点的单链表的长度public int length(){Node p=head.next;//初始化,p指向首结点int length=0;//length为计数器while(p!=null){//从首结点开始向后查找,直到p为空p=p.next;//指向后继结点++length;//长度增一}return length;}// 按序号查找public Object get(int i) throws Exception{Node p=head.next;//初始化,p指向首结点int j=0;//计数器while(p!=null&&j<i){//从首结点开始向后查找,直到p指向第i个结点或者p为空p=p.next;//指向后继结点++j;//计数器值加一}if(j>i||p==null){//i小于0或者大于表长时,即i不合法throw new Exception("第"+i+"个元素不存在");//抛出异常}return p.data;//返回结点p的数据域值}//带头结点的单链表上的插入操作算法public void insert(int i, Object x) throws Exception{Node p=head;//初始化,p指向头结点int j=-1;//j是计数器while(p!=null&&j<i-1){//寻找第i个结点的前驱p=p.next;++j;//计数器的值加1}if(j>i-1||p==null){//i不合法throw new Exception("插入位置不合法");//抛出异常}Node s=new Node(x);//生成新结点s.next=p.next;//修改链,新结点的下一个结点为原本结点的下一个p.next=s;//原本结点的下一个为新结点}//删除public void remove(int i) throws Exception{Node p=head;//初始化,p指向头结点int j=-1;while(p.next!=null&&j<i-1){//寻找第i个结点的前驱p=p.next;++j;}if(j>i-1||p.next==null){throw new Exception("删除位置不合法");}p.next=p.next.next;//使待删除结点从单链表中脱离出来}//按值查找public int indexOf(Object x){Node p=head.next;//初始化,p指向首结点int j=0;//j为计数器//从链表的首结点开始寻找,直到找到p.data或者到达单链表的表尾while(p!=null&&p.data!=x){p=p.next;//指向下一个结点++j;//计数器的值加1}if(p!=null){return j;//返回值为x的结点在单链表中的位置}else {return -1;//不存在,返回-1}}public void display(){Node node=head.next;//取出带头结点的单链表中的首结点while(node!=null){System.out.println(node.data+" ");//输出结点的值node=node.next;//取下一个结点}System.out.println();}}


1 0
原创粉丝点击