• 单链表的操作API


    /**
     * 1.1 根据值查询返回节点 findByValue
     * 1.2 根据角标查询返回指定的角标的值的节点 findByIndex
     * 2.1 链表头部插入 insertToHead
     * 2.2 链表尾部插入 insertTail
     * 3.1 在指定节点的之前插入 insertBefore
     * 3.2 在指定节点的之后插入 insertAfter
     * 4.1 根据对应的节点上的值删除节点 deleteByNode
     * 4.2 根据对应的节点删除节点  deleteByValue
     */
    public class SinglyLinkedList {
        private Node head = null;
        public static class Node{
            public int data;
            public Node next;
            public Node() {
            }
        public Node(int data, Node node) {
                this.data = data;
                this.next = node;
            }
            public int getData() {
                return data;
            }
            public void setData(int data) {
                this.data = data;
            }
            public Node getNode() {
                return next;
            }
            public void setNode(Node node) {
                this.next = node;
            }
        }
    
        /**
         * 根据值查询返回节点
         * @param data
         * @return
         */
        public Node findByValue(int data){
            Node p = head;
            while (p!=null && p.data != data){
                  p = p.next;
            }
            return p;
        }
    
        /**
         * 根据角标查询返回指定的角标的值的节点
         * @param raduis
         * @return
         */
        public Node findByIndex(int raduis){
            Node p = head;
            int pos = 0;
            while (p!=null && pos != raduis){
                 p = p.next;
                 pos++;
            }
            return p;
        }
    
        /**
         * 插入新的节点数据
         * @param data
         */
        public void  insertToHead(int data){
          Node newNode = new Node(data,null);
          insertToHead(newNode);
        }
    
        /**
         * 新节点
         * @param newNode
         */
        public void insertToHead(Node  newNode){
            if(head == null){
                head = newNode;
            }else {
               newNode.next = head;
               head = newNode;
            }
        }
    
        /**
         * 尾部插入
         * @param data
         */
        public void insertTail(int data){
         Node newNode = new Node(data,null);
         insertTail(newNode);
        }
    
    
        public void insertTail(Node newNode){
            if(head == null){
               head = newNode;
            }else {
              Node p = head;
              while (p != null){
                 p = p.next;
              }
              p.next =newNode;
            }
        }
    
    
        /**
         * 在指定的节点之前插入节点数据
         * @param node 指定的节点
         * @param newNode 要插入的新的数据
         */
        public void insertBefore(Node node,Node newNode){
            if(node == null ){
                return;
            }
            if(head == null){
               insertToHead(newNode);
            }
            Node p = head;
            while (p!= null && p.next!= node){
                p = p.next;
            }
            if(p == null){
                return;
            }
            newNode.next = node;
            p.next = newNode;
        }
    
        /**
         * 在指定的节点之后插入数据
         * @param node 指定的节点
         * @param newNode 要插入数据
         */
        public void insertAfter(Node node,Node newNode){
           if(node == null){
               return;
           }
            if(head == null){
                insertToHead(newNode);
            }
            newNode.next = node.next;
            node.next = newNode;
        }
    
    
        /**
         * 删除指定的节点
         * @param node 指定的节点数据
         */
        public void deleteByNode(Node node){
          if(head == null || node == null ){
              return;
          }
          if(node == head){
              head = head.next;
          }
          Node  p = head;
          while (p!= null && p.next != node){
             p = p.next;
          }
          if(p == null){
              return;
          }
          p = p.next.next;
          node.next = null;
        }
    
        /**
         * 根据指定的值删除对应的链表节点
         * @param value 对应的值
         */
        public void deleteByValue(int value){
            if(head == null){
                return;
            }
    
            Node p = head;
            Node prev = null;
            while (p!=null && p.data != value){
                prev = p;
                p = p.next;
            }
    
            if(p == null){
               return;
            }
    
            if(prev == null){
               head = head.next;
            }else {
                prev.next = p.next;
                p.next = null;
            }
    
        }
    
    }
    

      

  • 相关阅读:
    使用VS Code开发.Net Core 2.0 MVC Web应用程序教程之二
    使用VS Code开发.Net Core 2.0 MVC Web应用程序教程之一
    关于使用Iscroll.js异步加载数据后不能滑动到最底端的问题解决方案
    [系统集成] RT(Request Tracker)执行自定义脚本及发送微信、短信的实现方法
    [工具开发] 分享两个基于Heapster 和 Influxdb 的 Grafana 监控仪表盘模板
    [系统集成] 基于 elasticsearch 的企业监控方案
    BindWeb
    [系统集成] 基于Kubernetes 部署 jenkins 并动态分配资源
    [经验交流] Active-Active 方式设置 kubernetes master 多节点高可用
    [经验交流] Kubernetes Nginx Ingress 安装与使用
  • 原文地址:https://www.cnblogs.com/histlyb/p/16126839.html
Copyright © 2020-2023  润新知