zoukankan      html  css  js  c++  java
  • 链表 -- 单向链表(线性表)

    数据结构:通俗的讲,将现实生活中的逻辑结构转换成计算机物理存储。

    时间复杂性:程序运行的快慢,越快越好。

    空间复杂性:程序占用的硬盘,内存资源的大小,越小越好,但是前提是稳定性。

    数据结构就是为了以上的几个课题而研究,程序运行的越快,占用的资源越小,程序稳定。

    1,链表的基本操作

    建表,增加节点,删除节点,按照序号查找,定位

    2,链表的基本概念

          数组 vs 链表

    数组(内存中连续的存储空间)

    在无序的数组中,搜索效率低下

    在有序的数组中,插入效率低下

    在任何数组中,删除的效率低下

    数组的大小固定

    链表(内存中分散的位置)

    链表可以是一种有序或者无序的列表

    链表的内容通常存储在内存中分散的位置

    链表是由节点构成,每一个节点的结构都相同

    节点分为数据域和链域,数据域是存放节点的内容,链域是存放下一个节点的指针

    3,创建链表

    首先,创建节点类,节点包含当前的数据,以及下一个节点的指针,如下代码所示:

    public class Node {
    
        String name;// 当前数据是这种简单的属性,也可以是复杂的对象
        
        Node next;
        
        public Node(){
            
        }
        
        public Node(String name){
            this.name = name;
            this.next = null;//一个新的节点,下个节点视为null
        }
    }


    其次,创建链表类,代码如下

    public class Link{
    
        int size;
    
        Node first;
    
        public Link() {
            this.size = 0;
        }
    
        public boolean isEmpty() {
            return first == null;
        }
    
        public void addNode(String name) {
            if (first == null) {
                first = new Node(name);
                size++;
            } else {
                Node newNode = new Node(name);
                Node temp = first;
                while (temp.next != null) {
                    temp = temp.next;
                }
                temp.next = newNode;
                size++;
            }
        }
    
        public void removeNode(String name) {
            if (first == null) {
                return;
            }
    
            if (first.name.equals(name)) {
                first = first.next;
                size--;
                return;
            }
            Node temp = first;
            while (!temp.next.name.equals(name)) {
                temp = temp.next;
            }
            temp.next.next = temp.next;
            size--;
        }
    
        public void insertNode(String data, String name) {
            // 插入到指定位置
            Node temp = first;
            while (!temp.name.equals(data)) {
                temp = temp.next;
            }
            Node newNode = new Node(name);
            newNode.next = temp.next;
            temp.next = newNode;
            size++;
    
        }
    
        public void display() {
            Node temp = first;
            while (temp != null) {
                System.out.println(temp.name);
                temp = temp.next;
            }
        }
    
        public void insertFirst(String name) {
            // 插入到链表的第一个位置
            Node newNode = new Node(name);
            newNode.next = first;
            first = newNode;
            size++;
        }
    }

    测试类,以及打印结果如下:

    public class Test {
        
        public static void main(String[] args) {
            Link link = new Link();
            System.out.println(link.isEmpty()); 
            link.addNode("团队主管");
            System.out.println(link.size);
            link.addNode("部门助理");
            System.out.println(link.size);
            link.addNode("部门经理");
            System.out.println(link.size);
            link.addNode("人事经理");
            System.out.println(link.size);
            link.addNode("总经理");
            System.out.println(link.size);
            link.addNode("总裁");
            System.out.println(link.size);
            link.display();
            System.out.println("======我是分界线=========");
            
            System.out.println(link.isEmpty()); 
            
            System.out.println("======我是分界线=========");
            
            link.insertFirst("小组长");
            link.display();
            System.out.println("======我是分界线=========");
            
            link.removeNode("小组长");
            link.display();
            System.out.println("======我是分界线=========");
            
            link.addNode("董事长");
            link.display();
            
            System.out.println("======我是分界线=========");
            link.insertNode("部门经理", "人事助理");
            link.display();
        }
    }


    打印结果:

    true
    1
    2
    3
    4
    5
    6
    团队主管
    部门助理
    部门经理
    人事经理
    总经理
    总裁
    ======我是分界线=========
    false
    ======我是分界线=========
    小组长
    团队主管
    部门助理
    部门经理
    人事经理
    总经理
    总裁
    ======我是分界线=========
    团队主管
    部门助理
    部门经理
    人事经理
    总经理
    总裁
    ======我是分界线=========
    团队主管
    部门助理
    部门经理
    人事经理
    总经理
    总裁
    董事长
    ======我是分界线=========
    团队主管
    部门助理
    部门经理
    人事助理
    人事经理
    总经理
    总裁
    董事长


        链表类包含的了一些方法,是否为空,增加,删除,插入到指定位置之后,插入到第一个等。

         

  • 相关阅读:
    硅谷机场安装第一个咖啡机器人
    美国第一夫人,发推特更新她刚刚装饰好的白宫
    DAO设计模式
    高科技公司名字的由来
    项目管理的经验
    Shanghai InfoSys .NET engineer telephone interview
    {objccn.io}学习笔记-并发编程-常见的后台实践
    升级Xcode7之后VVDocumenter-Xcode不能用的解决办法
    推荐大家看的开发者博客
    iOS8 Layout Margins
  • 原文地址:https://www.cnblogs.com/pickKnow/p/9583832.html
Copyright © 2011-2022 走看看