zoukankan      html  css  js  c++  java
  • 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、实现这些主要是让自己对单链表的思想更清楚。

  • 相关阅读:
    20155330 2016-2017-2《Java程序设计》课程总结
    20155330 实验五 网络编程与安全 实验报告
    20155330 实验四 Android程序设计
    20155330 课堂测试 20170517
    20155330 实验三 敏捷开发与XP实践
    20155330 第十一周课堂练习(20170503)
    20155330 2016-2017-2 《Java程序设计》第十周学习总结
    20155330 2016-2017-2 《Java程序设计》第九周学习总结
    2017-2018-1 20155329 《信息安全系统设计基础》第13周学习总结
    2017-2018-1 20155329 实验五 通讯协议设计
  • 原文地址:https://www.cnblogs.com/mathlin/p/10616184.html
Copyright © 2011-2022 走看看