【数据结构】顺序表,链表

2023-11-08

前言

小亭子正在努力的学习编程,接下来将开启  javaEE  的学习~~

分享的文章都是学习的笔记和感悟,如有不妥之处希望大佬们批评指正~~

同时如果本文对你有帮助的话,烦请点赞关注支持一波, 感激不尽~~

目录

前言

顺序表

ArrayList

ArrayList的构造

 ArrayList的创建方法:

构造方法:

ArrayList常用方法

ArrayList的扩容机制

ArrayList的实现和常用方法的代码演示

                ArrayList小结

链表

链表的分类

LinkedList

 LinkedList的构造方法

LinkedList的其他常用方法介绍

LinkedList的实现和常用方法的演示

ArrayList和LinkedList的区别


线性表:

线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列...
线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储
 

顺序表

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。

ArrayList

在集合框架中,ArrayList是一个普通的类,实现了List接口。

 

【说明】
1. ArrayList是以泛型方式
2. ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问
3. ArrayList实现了Cloneable接口,表明ArrayList是可以clone的
4. ArrayList实现了Serializable接口,表明ArrayList是支持序列化的
5. 和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者CopyOnWriteArrayList
6. ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表

ArrayList的构造

 ArrayList的创建方法:
public static void main(String[] args) {
// ArrayList创建,推荐写法
// 构造一个空的列表
List<Integer> list1 = new ArrayList<>();
// 构造一个具有10个容量的列表
List<Integer> list2 = new ArrayList<>(10);
list2.add(1);
list2.add(2);
list2.add(3);
// list2.add("hello"); // 编译失败,List<Integer>已经限定了,list2中只能存储整形元素
// list3构造好之后,与list中的元素一致
ArrayList<Integer> list3 = new ArrayList<>(list2);

}
构造方法:
方法 解释
ArrayList() 无参构造
ArrayList(Collection<? extends E> c) 利用其他 Collection 构建 ArrayList
ArrayList(int initialCapacity) 指定顺序表初始容量
ArrayList常用方法
boolean add(E e) 尾插 e
void add(int index, E element) 将 e 插入到 index 位置
boolean addAll(Collection<? extends E> c) 尾插 c 中的元素
E remove(int index) 删除 index 位置元素
boolean remove(Object o) 删除遇到的第一个 o
E get(int index) 获取下标 index 位置元素
E set(int index, E element) 将下标 index 位置元素设置为 element
void clear() 清空
boolean contains(Object o) 判断 o 是否在线性表中
int indexOf(Object o) 返回第一个 o 所在下标
int lastIndexOf(Object o) 返回最后一个 o 的下标
List<E> subList(int fromIndex, int toIndex) 截取部分 list
ArrayList的扩容机制

ArrayList是一个动态类型的顺序表,即:在插入元素的过程中会自动扩容。

扩容的步骤:

1. 检测是否真正需要扩容,如果是调用grow准备扩容
2. 预估需要库容的大小初步预估按照1.5倍大小扩容,如果用户所需大小超过预估1.5倍大小,则按照用户所需大小扩容,真正扩容之前检测是否能扩容成功,防止太大导致扩容失败
3. 使用copyOf进行扩容

ArrayList的实现和常用方法的代码演示

public class MyArrayList{
    public int [] elem;//顺序表相当于一个数组
    public int usedSize;//有效数据的长度
    public static  final int DEFAULT_SIZE = 5;
    private boolean isFull;

    public MyArrayList(){
        this.elem = new int [DEFAULT_SIZE];//实例化
 }

    /*
    判断顺序表是否已满
     */
    public boolean isFull(){
        //看有效数据长度是否等于顺序表长度,等于返回true
        return this.usedSize == this.elem.length;
    }
     /*
      扩容
      */
    public void resize(){
        //Array.copyOf() 用于复制指定的数组内容以达到扩容的目的
        this.elem = Arrays.copyOf(this.elem, 2*this.elem.length);
    }
    /*
    新增数据
     */
    public void  add(int data){
        if(this.isFull){ //判断顺序表空间是否满了,如果满了,执行扩容
            resize();
        }
        this.elem[this.usedSize] = data ;//插入数据
        this.usedSize++; // 有效数据长度加1
    }
    /*
    打印顺序表
     */
    public void display(){
        for (int i = 0; i < this.usedSize; i++) {   //遍历有效的数据
            System.out.print(this.elem[i] + " ");
        }
        System.out.println();
    }
    /*
    获取顺序表的长度
     */
     public int size (){
        return this.usedSize;
     }
 /*
 判定是否包含某个元素
  */
    public boolean contains (int toFind){
        for (int i = 0; i < this.usedSize; i++) {
            if (this.elem [i] == toFind){
                return true;
            }
        }
        return false;
    }
 /*
 查找某个元素对应的位置
  */
    public int indexof(int toFind){
        for (int i = 0; i < this.usedSize; i++) {
            if (this.elem[i] == toFind){
                return  i;
            }
        }
        return -1;//数组没有负数下标
    }

    /*
    在 pos 位置新增元素 O(N)
     */
    public void add(int pos,int data){
        checkIndex(pos);
        if (isFull()){
            resize();
        }
        for (int i = usedSize-1; i >= pos; i--) {
            elem[i+1] = elem [i];
              }
        elem[pos] = data ;
        usedSize++;
    }
  /*
  检查add数据的时候,pos是否是合法的
   */
    private void checkIndex(int pos) {
        if (pos < 0|| pos > elem.length)
        //抛出异常
        throw new IndexOutOfException
                ("位置不合法,请检查位置的合法性");
    }

 /*
  获取 pos 位置的元素
  */
    public int get(int pos) {
        checkGetIndex(pos);
        return elem[pos];
    }
 /*
 检查取数据时pos的合法性
  */
    private void checkGetIndex(int pos) {
        if(pos < 0 || pos >= usedSize) {  //取数据的时候元素下标可以等于数组有效长度
            throw new IndexOutOfException
                    ("get获取元素的时候,位置不合法,请检查位置的合法性!");
        }
    }
 /*
 给 pos 位置的元素设为 value
  */
    public void set(int pos, int value) {
        checkIndex(pos);
        elem[pos] = value;//顺序表的优点就是可以随机存取
    }

 /*
 删除第一次出现的关键字key O(n)
  */
    public boolean remove(int toRemove) {
        int index = indexof(toRemove);// 找到那个元素对应的位置
        if(index == -1){  // 判断元素位置的合法性,-1不合法
            System.out.println("没有这个数据");
            return false;
        }
        //删除这个元素后,后面的元素要向前移动
        for (int i = index; i < usedSize-1 ; i++){
            elem[i] = elem [i+1];
        }
        usedSize--;
        elem[usedSize] = 0;
        //最后一个元素的位置要置为空,内置数据类型置为0就行
        //elem[usedSize] = null;
        // 如果里面是引用类型 那么此时就需要手动置空
        return true;
    }
     /*
     清空数据类型
      */
    public void  clear(){
        //直接把有效长度置为0
        usedSize = 0;
         /*遍历,把每一个元素都置为空
       for (int i = 0; i < usedSize; i++) {
            elem[i] = null;
        }
        usedSize = 0;
        */
    }
    public static void main(String[] args) {
        MyArrayList myArrayList = new MyArrayList();
        myArrayList.add(1);
        myArrayList.add(3);
        myArrayList.add(5);
        myArrayList.add(7);
        myArrayList.display();
        myArrayList.size();
        myArrayList.add(3,111);
        myArrayList.indexof(3);
        myArrayList.get(1);
        myArrayList.set(1,99);
        myArrayList.remove(3);
        myArrayList.clear();
        System.out.println("sssssss");
    }
}

ArrayList小结

1. ArrayList底层使用连续的空间,任意位置插入或删除元素时,需要将该位置后序元素整体往前或者往后搬移,故时间复杂度为O(N),所以不适合用在需要频繁删除插入的场景。相反,由于使用的是连续的空间,在知道下标位置的情况下很容易找到目标元素,时间复杂度为O(1),所以更适合用在查找检索的场景。
2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。
3. 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200,我们再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间。

链表

链表是一种由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针。

链表在逻辑上是连续的,在物理空间上可能连续也可能不连续。

链表的分类

1. 单向或者双向

单向链表中,每个节点只包含一个指向下一个节点的指针,最后一个节点的指针指向空。

双向链表中,每个节点除了一个指向下一个节点的指针,还包含一个指向前一个节点的指针,提供前后两个方向的遍历。

 2. 带头或者不带头

 3. 循环或者非循环

 

小结:

与数组相比,链表具有一些优点和缺点。链表插入和删除节点的时间复杂度为O(1),而在数组中插入和删除节点需要移动其他节点,时间复杂度为O(n)。但在链表中访问某个节点的时间复杂度为O(n),而在数组中的访问时间复杂度为O(1)。

因此,链表适合频繁进行插入和删除操作,而数组适合频繁进行访问操作。 链表常用于实现栈、队列和图等数据结构,也用于解决一些特定的问题,如求解约瑟夫问题等。


LinkedList

LinkedList的底层是双向链表结构(链表后面介绍),由于链表没有将元素存储在连续的空间中,元素存储在单独的节点中,然后通过引用将节点连接起来了,因此在在任意位置插入或者删除元素时,不需要搬移元素,效率比较高。

在集合框架中,LinkedList也实现了List接口,具体如下

【说明】
1. LinkedList实现了List接口
2. LinkedList的底层使用了双向链表
3. LinkedList没有实现RandomAccess接口,因此LinkedList不支持随机访问
4. LinkedList的任意位置插入和删除元素时效率比较高,时间复杂度为O(1)
5. LinkedList比较适合任意位置插入的场景

 LinkedList的构造方法

方法 解释
LinkedList() 无参构造
public LinkedList(Collection<? extends E> c) 使用其他集合容器中元素构造List

LinkedList的其他常用方法介绍

方法 解释
boolean add(E e) 尾插 e
void add(int index, E element) 将 e 插入到 index 位置
boolean addAll(Collection<? extends E> c) 尾插 c 中的元素
E remove(int index) 删除 index 位置元素
boolean remove(Object o) 删除遇到的第一个 o
E get(int index) 获取下标 index 位置元素
E set(int index, E element) 将下标 index 位置元素设置为 element
void clear() 清空
boolean contains(Object o) 判断 o 是否在线性表中
int indexOf(Object o) 返回第一个 o 所在下标
int lastIndexOf(Object o) 返回最后一个 o 的下标
List<E> subList(int fromIndex, int toIndex) 截取部分 list

LinkedList的实现和常用方法的演示

public class MyLinkedList {
    public static class ListNode {
        public int val;
        public ListNode prev;//前驱
        public ListNode next;//后继
        public ListNode(int val) {
            this.val = val;
} }

    public ListNode head;
    public ListNode last;
 //打印
    public void display() {
        ListNode cur = head;
        while (cur != null) {
            System.out.print(cur.val + " ");
            cur = cur.next;
        }
    }
 //求链表长度
    public int size() {
        ListNode cur = head;
        int len = 0;
        while (cur != null) {
            len++;
        }
        return len;
    }

//查找是否包含关键字key
    public boolean contains(int key) {
        ListNode cur = head;
        while (cur != null) {
            if (cur.val == key) {
                return true;
            }
            cur = cur.next;
        }
        return false;
    }
//头插法
    public void addFirst(int data) {
        ListNode node = new ListNode(data);
        if (head == null) {
            head = node;
            last = node;
        } else {
            head.prev = node;
            node.next = head;
            head = node;
        }
    }

//尾插法
    public void addList(int data) {
        ListNode node = new ListNode(data);
        if (head == null) {
            head = node;
            last = node;
        } else {
            node.prev = last;
            last.next = node;
            last = node;
        }
    }
 //任意位置插入
    public void addIndex (int index ,int data){
        if(index < 0 || index > size()){
            System.out.println("地址不合法");//此处可以抛出异常
        }
        if (index == size()){
            addList(data);
            return;
        }
        ListNode cur = fidIndexSubOne(index);
        ListNode node = new ListNode(data);
        node.next = cur ;
        cur.prev.next = node;
        node.prev = cur.prev;
        cur.prev = node;
    }

    //查找下标
    private ListNode fidIndexSubOne(int index) {
        ListNode cur = head;
        int count = 0;
        while (count != index - 1) {
            cur = cur.next;
            count++;
        }
        return cur;
    }

    /*
    删除第一次出现关键字为key的结点
    特殊情况是删头和删尾
     */
    public void remove(int key) {
        ListNode cur = head;
        while (cur != null) {
            if (cur.val == key) {
                //删除的是头结点
                if (cur == head){
                    head = head.next;
                    //如果只有一个节点
                    if (head != null) {
                        head.prev = null;
                    }
                }else {
                    //中间部分的结点
                    cur.prev.next = cur.next;
                    if (cur.next != null){   //不是尾结点
                        cur.next.prev = null;
                    }else { //是尾结点
                        last = last.prev;
                    }
                }
                    return;
            }
            cur = cur.next;
        }

    }
    /*
    删除所有的关键字为key的结点
    删除第一个的那个最后不return就行
     */
    public void removeAllKey(int key) {
        ListNode cur = head;
        while (cur != null) {
            if (cur.val == key) {
                //删除的是头结点
                if (cur == head){
                    head = head.next;
                    //如果只有一个节点
                    if (head != null) {
                        head.prev = null;
                    }
                }else {
                    //中间部分的结点
                    cur.prev.next = cur.next;
                    if (cur.next != null){   //不是尾结点
                        cur.next.prev = null;
                    }else { //是尾结点
                        last = last.prev;
                    }
                }

            }
            cur = cur.next;
        }

    }

    /*
    清除
    解法:遍历链表,把每一个结点的前驱和后继都置为空
     */
    public void  clear (){
        ListNode cur = head ;
        while (cur != null){
            ListNode curNext = cur.next;
            cur.prev = null;
            cur.next = null;
            cur = curNext;
        }
        head = null;
        last = null;
    }

}

ArrayList和LinkedList的区别

不同点 ArrayList LinkedList
存储空间上 物理上一定连续 逻辑上连续,但物理上不一定连续
随机访问 支持O(1) 不支持:O(N)
头插 需要搬移元素,效率低O(N) 只需修改引用的指向,时间复杂度为O(1)
插入 空间不够时需要扩容 没有容量的概念
应用场景 元素高效存储+频繁访问 任意位置插入和删除频繁
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【数据结构】顺序表,链表 的相关文章

  • 尝试提取 jar 文件时出错

    我正在尝试使用以下命令提取 jar 文件 C Program Files Java jdk1 7 0 25 bin gt jar xf C Users MyJar jar 但出现错误 java io IOException META INF
  • 将字符串转换为整数数组 String at = "1 2 3 4 5" 转换为 ar=[1,2,3,4,5]

    我正在读取一个字符串 作为一整行数字 用空格分隔 即1 2 3 4 5 我想将它们转换为整数数组 以便我可以操作它们 但这段代码不起作用 它说不兼容的类型 String str br readLine int array new int 4
  • 如何制作具有两个索引的 Map?

    我在java中有一张这样的地图 Map
  • 如何在异常处理程序中访问访问请求主体

    我们有一个 Spring Boot 应用程序 我们的控制器期望在我们的端点之一中有一个 XML 文档元素 PostMapping value api v1 do stuff consumes APPLICATION XML VALUE pr
  • 使用 WebDriver 暂时绕过隐式等待

    当使用隐式等待时 正如这里所建议的 https stackoverflow com a 10950905 56285 我仍然有时想要断言即时元素不可见或不存在 换句话说 我know有些元素应该隐藏 并希望我的测试做出这样的断言fast 而不
  • Java生成范围内不重复的随机数

    我想生成 1 到 4 范围内的随机数 包括 4 这是我的代码 int num r nextInt 4 1 r is instance of Random 但是 我在循环中运行上述代码 并且不想重复随机数 现在发生的事情我经常得到 1 1 1
  • Java Sound可以用来控制系统音量吗?

    Java 声音优惠FloatControl各种声音线路功能的实例 以及MASTER GAIN http docs oracle com javase 7 docs api javax sound sampled FloatControl T
  • 堆内存与对象内存

    根据一篇关于Java内存和特性的论文 内存分数分为两种类型 堆内存 即应用程序在运行时消耗的内存 对象内存 即程序中使用的各种对象分配的内存 例如整数和字符串等 他们的意思是stack当他们说时的记忆object记忆 或者它们是什么意思 很
  • 从多个地方绘制 JPanel

    我目前正在为学校开发一款 Java 2D 游戏 我们必须使用抽象工厂设计模式 对于 2D 实现 我使用工厂如下 public class Java2DFact extends AbstractFactory public Display d
  • 在所有方法调用上允许类型见证有什么意义?

    假设我们有两种方法 如下所示 public static
  • 一起使用 String 和 int 时的 System.out.println 行为 [重复]

    这个问题在这里已经有答案了 考虑下面的代码片段 public class Student public static void main String args int a 3 int b 4 System out println a b
  • 字节流和字符流

    请解释一下什么是字节流和字符流 这些究竟意味着什么 Microsoft Word 文档是面向字节的还是面向字符的 Thanks 流是一种顺序访问文件的方式 字节流逐字节访问文件 字节流适用于任何类型的文件 但不太适合文本文件 例如 如果文件
  • 如何将空字符串序列化为单个空标签?

    我使用 Simple XML 框架序列化此类 Root public class HowToRenderEmptyTag Element required false private String nullString 我想得到
  • 如何在 Struts 2 中访问 OGNL 跟踪评估?

    有人告诉我要优化网络应用程序 为此 我使用JProfiler https www ej technologies com products jprofiler overview html 我注意到很大一部分响应时间都花在了表示层上 特别是当
  • 在JAVA中将数据写入.txt文件?

    我想知道是否是在JAVA中将计算的数据写入文本文件 我的 JAVA 代码是一个基于 GUI 的 gpa 计算器 我只想添加一个 JButton 和 ActionListener 它将类名 GPA 点和计算出的 GPA 写入 txt 文件 这
  • 有没有办法防止 Spring Boot 覆盖 bean?

    与春天的抽象可刷新应用程序上下文 http docs spring io spring docs current javadoc api org springframework context support AbstractRefresh
  • 如何找到 JAR:/home/hadoop/contrib/streaming/hadoop-streaming.jar

    我正在练习有关 Amazon EMR 的复数视角视频教程 我被困住了 因为我收到此错误而无法继续 Not a valid JAR home hadoop contrib streaming hadoop streaming jar 请注意
  • 自动将通配符导入重构为 IntelliJ 中的显式导入(适用于 Scala/Java)

    考虑下面的代码 是否可以让 IntelliJ 自动将每个通配符导入重构为显式导入 无论范围内使用什么 例如import scalatags JsDom all into import scalatags JsDom all ol li di
  • 如何在Java中添加两个“卡”的值?

    我正在开发一个项目来模拟二十一点游戏中的第一笔交易 到目前为止 程序创建了两张随机等级 ACE 到 KING 和随机花色的牌 我正在努力创建一个切换表或 if else 梯形图 将两张卡的附加值分配为可变分数 下面的代码从概念上代表了我想要
  • java 更新进度条

    我有一个 JFrame 和以下组件 JButton jButton1 Progress Bar ProgressBar 及其公共静态 JLabel 状态及其公共静态 单击按钮时会执行不同的语句 我想在每个语句后更新我的进度条 这是我的代码

随机推荐

  • android 使用BitmapShader实现圆形以及放大镜效果

    在一些显示用户头像的时候 大多数都是显示圆形的 而不是显示一个正方形或者长方形 这样显得很呆板 视觉效果也不好看 今天就用二种方式实现图片圆形显示的效果 在先讲这个效果实现之前 讲下BitmapShader到底能干嘛 android有几个关
  • 多尺度无序池化卷积神经网络——MOP-CNN(MultiScale Orderless Pooling)

    本文讲解的是Yunchao Gong发表在2014年的ECCV会议上的 Multi Scale Orderless Pooling of Deep Convolutional Activation Features 中文译名是深度卷积激活特
  • EasyAR平面图形跟踪和识别图上显示视频

    功能简介 Planar Image Tracking是用于检测与跟踪日常生活中有纹理的平面物体 所谓 平面 的物体 可以是一本书 一张名片 一幅海报 甚或是一面涂鸦墙这类具有平坦表面的物品或事物 这些物体应当具有丰富且不重复的纹理 为了创建
  • Android-自定义UI模板

    我们要用UI模板的时候 如果所有的Topbar内容都是没有变的话 那我们用在xml文件中include进去就好了 但是如果Topbar中的内容是会随着fragment或者activity改变的话 拿我们总不能每次都去写多个文件 再分别inc
  • QT学习-界面中实时绘制函数图像

    通过重写QT中QWidget类中的paintEvent函数 我们就可以做到在widget中进行函数图像的绘制 我使用的是QCreator的UI设计器 首先我们需要从QWidget继承一个子类 并重写他的paintEvent class sh
  • poi导入导出

    为什么要使用poi呢 为什么不适用easypoi和easyexcel呢 那肯定是这两个工具类不能实现功能 所以才采用poi啊 一般的导入导出 就采用上面两个工具就可以了 简单方便 但是如果你要对单元格进行复杂的操作的时候 需要对特定的单元格
  • C#关于时间(获取特定格式的时间及多种方式获取当前时间戳)以及10位和13位时间戳转为特定格式

    一 获取当期时间并转为特定格式 string tradeTime DateTime Now ToString yyyyMMddHHmmss DateTimeFormatInfo InvariantInfo 设置所需要的时间格式 string
  • 判断对象里的属性是否都为空(适用字符串、数组结构对象)

    好久没写博客记录了 场景 表单填写时 填写完对应栏目需要有填完的标识 下面是自己写的一坨代码 export function objecAtrtIsEmpty data 如果是数组 遍历数组里面的 if Array isArray data
  • ubuntu18.04安装pycharm专业版

    安装的pycharm版本 2017 4 操作系统 ubuntu18 04 LTS 步骤1 在官网下载安装包 https www jetbrains com pycharm download section linux 下载文件位于 Down
  • 一. 了解web及网络基础

    一 了解web及网络基础 web world wide web 万维网 是建立在互联网上的网络服务 分为网页和服务器 起初 互联网还只是少数人 为了能够远距离分享知识 前辈们提出一种设想 借助超文本 包含其他文档链接的文本 连成可相互参阅的
  • wangEditor 富文本在vue3的使用

    安装 yarn add wangeditor editor 或者npm install wangeditor editor save yarn add wangeditor editor for vue next 或者 npm instal
  • java大文件下载内存溢出解决办法

    第一种解决办法内存够用的情况 启动时设置 Xmx的值大一点 比如2G 第二种办法代码中使用缓冲流的方式 如果是本地文件就更好 如果是还需要再去文件服务器中下载一次也行 例子 private void download String down
  • 宜搭低代码开发师(高级)考试选择题错误整理集(自己整理的,考试前是50多分,看了后答题93分)

    目录 完成高级选择题认证目标 这是我考了无数次 整理的错题集 希望能够帮助到你 考
  • Win11编译cpu版本的pytorch源码

    1 下载源码和依赖库 首先 在github上下载指定版本的pytorch源码 地址如下 https github com pytorch pytorch 因为在pytorch源码中有一些依赖库是直接给出的超链接 因此都需要直接离线下载依赖库
  • 控制结构程序设计1

    某企业员工按小时计算工资 每月劳动时间 小时 每小时工资 总工资 总工资中扣除10 公积金 剩余的为应发工资 编写一个程序计算并输出某位员工的应发工资 具体要求 该员工的劳动时间和每小时工资数通过键盘输入 且在输入前要有提示信息 在输出结果
  • Node初次安装配置

    Node初次安装配置文档 一 下载Node js 安装Node js Node 官网地址 https nodejs org en 这里我们安装LTX版的 这个比较稳定 检查Node是否安装成功 win R cmd 按住键盘的win键和R键
  • day18Excise1

    1 阅读下面XML文档 然后判断下列说法正确的是 C
  • linux解压gz文件的命令

    解压tar gz文件的命令 LINUX解压缩TAR GZ文件命令 1 解压缩命令格式 tar zxvf 压缩文件名 tar gz 解压缩后的文件只能放在当前的目录 2 压缩命令格式 tar zcvf 压缩文件名 tar gz 被压缩文件名
  • 移动端页面禁止鼠标滑轮滚动的方法

    document body onmousewheel function event event event window event return false 火狐下使用 DOMMouseScroll document body addEv
  • 【数据结构】顺序表,链表

    前言 小亭子正在努力的学习编程 接下来将开启 javaEE 的学习 分享的文章都是学习的笔记和感悟 如有不妥之处希望大佬们批评指正 同时如果本文对你有帮助的话 烦请点赞关注支持一波 感激不尽 目录 前言 顺序表 ArrayList Arra