2019-03-28 java数据结构(二) 单链表

一、理解:

  想象一串小袋子,串在一起,一个小袋子代表一个节点,袋子里面可以装东西(数据),这样一个小袋子连接一个小袋子,串起来就像一个单链表。

二、代码实现:

  (1)、单链表实现的接口,先展示所有需要实现方法

public interface IList {
    void clear();
    boolean isEmpty();
    int size();
    Object get(int i) throws Exception;
    void insert(int i,Object o) throws Exception;
    int indexOf(Object o);//查询数据在链表的位置
    void remove(int i) throws Exception;
    void display();
}

  (2)、节点类

public class Node {
    public Object data;//存放 数据元素的值
    public Node next;//指针域,存放后继节点(后续节点地址)
    public Node(Object data,Node next){
        this.data=data;
        this.next=next;
    }
    public Node(){
        this(null,null);
    }
    public Node(Object data){
        this(data,null);
    }
}

  (3)、单链表实现类

public class LinkList implements IList{
    public Node head;//单链表头指针
    public LinkList(){
        head=new Node();//初始化头结点
    }
    //构造一个长度为n的单链表
    public LinkList(int n)throws Exception{
        this();
        create(n);
    }
    private void create(int n) throws Exception{
        Node p=head;
        for (int i = 0; i < n; i++) {
            Node a=new Node("i:"+i);
            p.next=a;
            p=a;
        }                                                                                                
    }
    public void clear() {
        //直接清空表头数据就行
        head.data=null;
        head.next=null;
    }
    public boolean isEmpty() {
        // 判断表头数据
        return head.next==null;
    }
    public int size() {
        int i=0;
        Node p=head;
        while((p=p.next)!=null)
            i++;
        return i;
    }
    public Object get(int i) throws Exception {
        if(i>=size() || i<0)
            return null;
        Node p=head;
        while(i>=0){
            p=p.next;
            i--;
        }
        return p.data;
    }
    public void insert(int i, Object o) throws Exception {
        if(i>size() || i<0)
            throw new Exception("边界超出!!");
        Node p=head;
        //跑到插入位置的前一个节点
        for (int j = 0; j < i; j++) {
            p=p.next;
        }
        Node pos=p.next;
        if(pos==null){
            p.next=new Node(o);
        }
        else{
            p.next=new Node(o);
            p.next.next=pos;
        }
    }
    public int indexOf(Object o) {
        int i=0;
        Node p=head;
        while((p=p.next)!=null){
            if(p.data.equals(o))
                return i;
            i++;
        }
        return -1;
    }
    public void remove(int i) throws Exception {
        if(i>=size() || i<0)
            throw new Exception("边界超出!!");
        Node p=head;
        for (int j = 0; j < i; j++) 
            p=p.next;
        p.next=p.next.next;
    }
    public void display() {
        Node p=head;
        while((p=p.next)!=null){
            System.out.print(p.data+" ");
        }
        System.out.println();
    }
}

三、代码测试

public class MyTest {
    public static void main(String[] args) throws Exception {
        demo2();
    }
    //测试自制链表 LinkList
    public static void demo2() throws Exception{
        LinkList ll=new LinkList(3);
        ll.display();
        ll.insert(2, "insert2");
        ll.display();
    } 
}

这里简单弄一个方法出来展示,LinkList 里面所有的方法都已自测过。

四、过程总结

1、在这个方法的实现过程中 public Object get(int i) throws Exception,一开始是将Node返回去了。后面改成将Node,data 返回了。还有其他方法中出现的Object ,是以Node.data来做比较的。

2、实现这些主要是让自己对单链表的思想更清楚。

posted @ 2019-03-28 16:59  math_lin  阅读(210)  评论(0编辑  收藏  举报