• java 数据结构单链表的操作


    一、手写一个单链表

      

    public class ListNode<T>{
    
        /**
         * 数据
         */
        public T obj;
        /**
         * tail 指针
         */
        public ListNode next;
    
        ListNode(T obj){
            this.obj = obj;
        }
    
    }
    

      创建单链表工具类

    public class ListNodeUtils {
    
        /**
         * 单链表头部插入新节点
         * @param head 链表头节点
         * @param newHead 要插入的头节点
         */
        public static void insertHead(ListNode head, ListNode newHead){
            ListNode oldHead = head; //保存原头节点
            head = newHead; //新的头节点赋值给原头节点
            head.next = oldHead; //新的头节点指向原头节点
        }
    
        /**
         * 单链表尾部插入新节点
         * @param tail 链表尾节点
         * @param newTail 要插入的尾节点
         */
        public static void insertTail(ListNode tail, ListNode newTail){
            ListNode oldTail = tail; //保存原来的尾节点
            tail = newTail;//赋值新的尾节点给原来的尾节点
            oldTail.next = tail;//旧的尾节点指向新的尾节点
            tail.next = null;//新的尾节点指向NULL
        }
    
        /**
         * 单链表在node1之后插入node2
         * @param node1
         * @param node2
         */
        public static void insetNode(ListNode node1, ListNode node2){
            ListNode next = node1.next;//保存原节点的下个节点
            node1.next = node2;//node1节点指向node2节点
            node2.next = next;//node2节点指向node1的下个节点
        }
    
        /**
         * 删除节点
         * @param head
         * @param delNode
         */
        public static void delNode(ListNode head, ListNode delNode){
            //删除非 尾节点
            if(delNode != null && delNode.next != null){
                ListNode next = delNode.next;//保存下个节点
                delNode.obj = next.obj;//将下个节点的值赋值给当前节点
                delNode.next = next.next;//将该节点指向下个节点的下个节点
                next = null;//释放需要删除的节点
            }
            //删除尾节点
            if(delNode.next == null){
                while (head != null){
                    if(head.next != null && head.next == delNode){
                        head.next = null;
                        delNode = null;
                    }
                    head = head.next;
                }
            }
    
        }
    
        /**
         * 查找节点
         * @param head 头节点
         * @param obj 需要查找节点
         */
        public static <T> int findNode(ListNode head, T obj){
            int index = 0;
            while (head != null){
                if(head.obj.equals(obj)){
                    return index;
                }
                index ++;
                head = head.next;
            }
            return index;
        }
    
        /**
         * 遍历单链表
         * @param head 头节点
         */
        public static void cycleNode(ListNode head){
            while(head != null){
                System.out.print(head.obj + "; ");
                head = head.next;
            }
            System.out.println();
        }
    
    }
    

      测试单链表工具类的方法

        public static void main(String[] args) {
            //创建三个节点
            ListNode listNode1 = new ListNode("这是节点1");
            ListNode listNode2 = new ListNode("这是节点2");
            ListNode listNode3 = new ListNode("这是节点3");
            //创建节点指向关系
            listNode1.next = listNode2;
            listNode2.next = listNode3;
            listNode3.next = null;
    
            cycleNode(listNode1);
    
            //头部插入测试
            ListNode listNode0 = new ListNode("这是节点0");
            insertHead(listNode1, listNode0);
            cycleNode(listNode0);
    
            //尾部插入测试
            ListNode listNode4 = new ListNode("这是节点4");
            insertTail(listNode3, listNode4);
            cycleNode(listNode0);
    
            //中间插入  node2后插入 node5
            ListNode listNode5 = new ListNode("这是节点5");
            insetNode(listNode2, listNode5);
            cycleNode(listNode0);
    
            //删除节点
            delNode(listNode0, listNode5);
            cycleNode(listNode0);
    
            //查找节点
            System.out.println(findNode(listNode0, "这是节点3"));
        }
    

      运行结果:

    这是节点1; 这是节点2; 这是节点3; 
    这是节点0; 这是节点1; 这是节点2; 这是节点3; 
    这是节点0; 这是节点1; 这是节点2; 这是节点3; 这是节点4; 
    这是节点0; 这是节点1; 这是节点2; 这是节点5; 这是节点3; 这是节点4; 
    这是节点0; 这是节点1; 这是节点2; 这是节点3; 这是节点4; 
    3
    

      



  • 相关阅读:
    JMeter学习-图形化 HTML 报表概要说明
    转《Python爬虫学习系列教程》学习笔记
    PYTHON __main__
    python property
    loadrunner脚本,如何获取lr的变量以及lr变量和其他程序语言的变量的转换
    参考链接
    彻底抛弃脚本录制,LR脚本之使用web_custom_request函数自定义http请求
    如何看Analysis分析图
    Ubuntu16.04安装QQ2015
    Ubuntu16.04运行LSD-SLAM踩坑笔记
  • 原文地址:https://www.cnblogs.com/bert227/p/13474355.html
Copyright © 2020-2023  润新知