zoukankan      html  css  js  c++  java
  • 单链表及其应用

    1.链表是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。

    使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。

    2.单链表是链表中结构最简单的。一个单链表的节点(Node)分为两个部分,第一个部分(data)保存或者显示关于节点的信息,另一个部分存储下一个节点的地址。最后一个节点存储地址的部分指向空值。

     3.链表实现

    package signle;
    
    /**
     * @Author lizhilong
     * @create 2019/11/7 17:12
     * @desc
     */
    public class SignleLinkList {
    
        private int size;
    
        private Node head;
    
        public SignleLinkList() {
            this.size = 0;
            this.head = null;
        }
    
        /**
         * 链表头后面增加节点
         *
         * @param object
         * @return
         */
        public Object addAfterHead(Object object) {
            Node newNode = new Node(object);
            if (size == 0) {
                head = newNode;
            } else {
                Node current = head;
                while (current.next != null) {
                    current = current.next;
                }
                current.next = newNode;
            }
            size++;
            return object;
        }
    
        /**
         * 在链表头前增加节点
         *
         * @param object
         * @return
         */
        public Object addbeforeHead(Object object) {
            Node newNode = new Node(object);
            if (size == 0) {
                head = newNode;
            } else {
                newNode.next = head;
                head = newNode;
            }
            size++;
            return object;
        }
    
        /**
         * 从头删除
         *
         * @return
         */
        public Object remove() {
            Object data = head.data;
            head = head.next;
            size--;
            return data;
        }
    
    
        /**
         * 查找位置
         *
         * @param object
         * @return
         */
        public int find(Object object) {
            Node h = head;
            int index = -1;
            while (h.data != object) {
                index++;
                h = h.next;
            }
            return index + 1;
        }
    
        /**
         * 删除指定元素
         *
         * @param object
         * @return
         */
        public boolean delete(Object object) {
            if (size == 0) {
                return false;
            }
            Node current = head;
            Node preNode = head;
            while (current.data != object) {
                if (current.next == null) {
                    return false;
                } else {
                    preNode = current;
                    current = current.next;
                }
            }
            //目标元素是头节点
            if (current == head) {
                head = current.next;
                size--;
            } else {
                preNode.next = current.next;
                size--;
            }
            return true;
        }
    
        /**
         * 打印链表所有元素
         */
        public void display() {
            Node current = head;
            StringBuilder builder = new StringBuilder();
            builder.append("[");
            while (current.next != null) {
                builder.append(current.data.toString() + "->");
                current = current.next;
            }
            builder.append(current.data.toString());
            builder.append("]");
            System.out.println(builder.toString());
        }
    
        /**
         * 单链表反转
         */
        public SignleLinkList reverse() {
           SignleLinkList rev = new SignleLinkList();
           Node h = head;
           while (h.next != null){
               rev.addbeforeHead(h.data);
               h = h.next;
           }
           rev.addbeforeHead(h.data);
           return  rev;
        }
    
    
        public  int getSize(){
            return  size;
        }
        /**
         * @Author lizhilong
         * @create 2019/11/7 17:10
         * @desc
         */
        public class Node {
    
            private Object data;
    
            private Node next;
    
            public Node(Object data) {
                this.data = data;
            }
        }
    }

    4.链表应用之实现栈

    package signle;
    
    /**
     * @Author lizhilong
     * @create 2019/11/8 15:32
     * @desc
     */
    public class Stack {
    
        private  SignleLinkList linkList;
    
        public Stack(){
            linkList = new SignleLinkList();
        }
    
        /**
         * 入栈
         * @param data
         */
        public  void  push(Object data){
            linkList.addbeforeHead(data);
        }
    
    
        public Object  pop(){
            return  linkList.remove();
        }
    
    
        public  void  display(){
            linkList.display();
        }
    }

    5.链表应用之实现队列

    package signle;
    
    /**
     * @Author lizhilong
     * @create 2019/11/8 16:00
     * @desc
     */
    public class Queue {
    
        private SignleLinkList linkList;
    
        public  Queue(){
            linkList = new SignleLinkList();
        }
    
        public void  put(Object data){
            linkList.addAfterHead(data);
        }
    
        public Object take(){
            return  linkList.remove();
        }
    
        public void display(){
            linkList.display();
        }
    }
  • 相关阅读:
    git+jenkins持续集成一:git上传代码
    性能测试五十:Jmeter+Influxdb+Grafana实时数据展示系统搭建
    性能测试四十九:ngrinder压测平台
    性能测试四十八:Jenkins+Ant+Jmeter系统部署
    性能测试四十七:jmeter性能监控工具ServerAgent
    工具篇:使用natapp工具映射内网到外网访问
    总想自己动动手系列·3·微信公众号和外网服务交互之通过TOKEN验证(准备篇·1)
    总想自己动动手系列·2·本地和外网(Liunx服务器上部署的web项目)按照自定义的报文格式进行交互(完结篇)
    总想自己动动手系列·1·本地和外网(Liunx服务器上部署的web项目)按照自定义的报文格式进行交互(准备篇)
    Linux-在新买的阿里云服务器上部署Tomcat并支持外网访问的配置(步骤记录)
  • 原文地址:https://www.cnblogs.com/li-zhi-long/p/11821313.html
Copyright © 2011-2022 走看看