java-数据结构-链表

基于simulink的变压器保护仿真设计【MATLAB源码+Word文档】 电力系统变压器保护MATLAB/simulink仿真设计。纵联差动保护-过电流保护-距离保护 阅读详情

单链表

​

结点:由数据域和指针域组成

​

链表长什么样子?(大概这样)

​

后继与前驱: 例如上图a1是a2 的前驱,a3是a2的后继。

头结点和头(尾)指针:头结点是指链表的第一个结点(例如上图中的a1)、

头指针(head):是仅仅是一个引用变量,储存头结点地址的指针而已。

尾指针(tail):是链表中最后一个结点的指针。

链表的操作

添加元素

1.当链表为空时,将头指针和尾指针都指向新增结点。如图

                                      

 2.链表中有元素,在表头添加元素,先将新增结点的指针域指向原链表的首结点,然后将头指针指向新增结点。此时的新增结点就是新的头结点。如图

                    

3.在链表的表尾添加,先将尾结点的指针域(不是尾指针)指向新增结点,然后再将尾指针指向新增结点。

                 

 3.在链表中添加,如图假如我们想在2这个结点后添加一个结点,则先将结点2 的指针域为空,然后在让新增的这个结点的指针域指向3结点,然后2的指针域指向新增的这个结点。

 将2结点的指针域为null

将新增结点的指针域指向结点3

将结点2 的指针域指向新增结点

 删除操作

1.在表头删除结点,先将头指针指向下一个结点(此时下一个结点即将成为首结点),然后再将原首结点的指针域为空。

将原首结点的指针域为空

 2.在表尾删除结点,先定义一个p指针,让p指向最后一个结点(假设将最后一个几点设为n)的前一个结点(n-1),然后将n-1结点的指针为空,再将尾指针指向n-1结点。

 将尾指针指向n-1结点

 3.在链表中删除,假定,我们要删除第四个结点,还是定义一个p指针,将p指向删除结点的前一个结点(也就是结点3),先将结点3 的指针域指向结点5,然后再将删除的结点的指针域为null。

 

 将结点3的指针域指向结点5

 删除的指针域为null

 链表的选择排序

排序问题(从小到大):先新定义两个nodeA,nodeB指针,nodeA指向首结点,nodeB指向第二个结点,,然后比较这两个指针所指的结点的数据域的大小,若nodeB比nodeA小,则交换数据域

。

 第二圈比较,重复操作

 获得子链表

 获得2到5的子链表

先创建两个指针,分别为nodeA,nodeB,分别指向结点2和结点5,然后在定义一个指针p,将指针p=指针nodeA,在创建一个链表,用while循环,将各个几点添加到新链表中

 代码

public class LinkedStringlyList<E> implements LinearTable<E> {

    //定义结点对象
    private class Node {
        E data;     //数据域
        Node next;  //指针域
        public Node(){
            this(null,null);
        }
        public Node(E data) {
            this(data,null);
        }
        public Node(E data, Node next) {
            this.data = data;
            this.next = next;
        }
        @Override
        public String toString() {
            return data.toString();
        }
    }
    private Node head;  //头指针
    private Node tail;  //尾指针
    private int size;   //元素的个数

    public LinkedStringlyList() {
        head = null;
        tail = null;
        size = 0;
    }

    public LinkedStringlyList(E[] arr) {
        if (arr == null || arr.length == 0) {
            throw new IllegalArgumentException("arr is null");
        }
        for (int i = 0; i < arr.length; i++) {
            add(arr[i]);
        }
    }

    @Override
    public void add(E element) {
        add(size, element);
    }

    @Override
    public void add(int index, E element) {
        if (index < 0 || index > size) {
            throw new IllegalArgumentException("add index out of range");
        }
        Node n = new Node(element);
        if (size == 0) {
            head = n;
            tail = n;
        } else if (index == 0) {
            n.next = head;
            head = n;
        } else if (index == size) {
            tail.next = n;
            tail = n;
        } else {
            Node p = head;
            for (int i = 0; i < index - 1; i++) {
                p = p.next;
            }
            n.next = p.next;
            p.next = n;
        }
        size++;
    }

    @Override
    public void remove(E element) {
        int index = indexOf(element);
        if (index != -1) {
            remove(index);
        }
    }
    @Override
    public E remove(int index) {
        if (index < 0 || index >= size) {
            throw new IllegalArgumentException("remove index out of range");
        }
        E ret = null;
        if (size == 1) {
            ret = head.data;
            head = null;
            tail = null;
        } else if (index == 0) {
            Node n = head;
            ret = n.data;
            head = n.next;
            n.next = null;
        } else if (index == size - 1) {
            Node p = head;
            while (p.next != tail) {
                p = p.next;
            }
            ret = tail.data;
            p.next = null;
            tail = p;
        } else {
            Node p = head;
            for (int i = 0; i < index - 1; i++) {
                p = p.next;
            }
            Node n = p.next;
            ret = n.data;
            p.next = n.next;
            n.next = null;
        }
        size--;
        return ret;
    }

    @Override
    public E get(int index) {
        if (index < 0 || index >= size) {
            throw new IllegalArgumentException("get index out of range");
        }
        if (index == 0) {
            return head.data;
        } else if (index == size - 1) {
            return tail.data;
        } else {
            Node p = head;
            for (int i = 0; i < index; i++) {
                p = p.next;
            }
            return p.data;
        }
    }

    @Override
    public E set(int index, E element) {
        if (index < 0 || index >= size) {
            throw new IllegalArgumentException("get index out of range");
        }
        E ret = null;
        if (index == 0) {
            ret = head.data;
            head.data = element;
        } else if (index == size - 1) {
            ret = tail.data;
            tail.data = element;
        } else {
            Node p = head;
            for (int i = 0; i < index; i++) {
                p = p.next;
            }
            ret = p.data;
            p.data = element;
        }
        return ret;
    }

    @Override
    public int size() {
        return size;
    }

    @Override
    public int indexOf(E element) {
        Node p = head;
        int index = 0;
        while (!p.data.equals(element)) {
            p = p.next;
            index++;
            if (p == null) {
                return -1;
            }
        }
        return index;
    }

    @Override
    public boolean contains(E element) {
        return indexOf(element) != -1;
    }

    @Override
    public boolean isEmpty() {
        return size == 0 && head == null && tail == null;
    }

    @Override
    public void clear() {
        head = null;
        tail = null;
        size = 0;
    }

    @Override
    public void sort(Comparator<E> c) {
        if (c == null) {
            throw new IllegalArgumentException("comparator can not be null");
        }
        //此处的插入排序O(n^3)
        /*
        for (int i = 1; i < size; i++) {
            E e = get(i);
            int j = 0;
            for (j = i; j > 0 && c.compare(get(j - 1), e) > 0; j--) {
                set(j, get(j - 1));
            }
            set(j, e);
        }
        */
        if (size == 0 || size == 1) {
            return;
        }
        Node nodeA = head;
        Node nodeB = nodeA.next;
        while (true) {
            while (true) {
                if (c.compare(nodeA.data, nodeB.data) > 0) {
                    swap(nodeA, nodeB);
                }
                if (nodeB == tail) {
                    break;
                }
                nodeB = nodeB.next;
            }
            if (nodeA.next == tail) {
                break;
            }
            nodeA = nodeA.next;
            nodeB = nodeA.next;
        }
    }

    private void swap(Node nodeA, Node nodeB) {
        E temp = nodeA.data;
        nodeA.data = nodeB.data;
        nodeB.data = temp;
    }

    @Override
    public List<E> subList(int fromIndex, int toIndex) {
        //0 <= fromIndex <= toIndex <= size - 1    [fromIndex,toIndex]
        if (fromIndex < 0 || toIndex >= size || fromIndex > toIndex) {
            throw new IllegalArgumentException("must 0 <= fromIndex <= toIndex <= size - 1");
        }

        LinkedStringlyList<E> list = new LinkedStringlyList<E>();
        /*
        for (int i = fromIndex; i <= toIndex; i++) {    //O(M)
            list.add(get(i));   //O(N) * O(M) = O(NM) ~ O(N^2)
        }
        */
        Node nodeA = head;
        for (int i = 0; i < fromIndex; i++) {
            nodeA = nodeA.next;
        }
        Node nodeB = head;
        for (int i = 0; i < toIndex; i++) {
            nodeB = nodeB.next;
        }
        Node p = nodeA;
        while (true) {
            list.add(p.data);
            if (p == nodeB) {
                break;
            }
            p = p.next;
        }
        return (List<E>) list;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append('[');
        if (isEmpty()) {
            sb.append(']');
        } else {
            Node p = head;
            while (true) {
                sb.append(p.data);
                if (p == tail) {
                    sb.append(']');
                    break;
                }
                sb.append(',');
                sb.append(' ');
                p = p.next;
            }
        }
        return sb.toString();
    }

    @Override
    public Iterator<E> iterator() {
        return new LinkedSinglyListIterator();
    }

    class LinkedSinglyListIterator implements Iterator<E> {
        private Node cur = head;

        @Override
        public boolean hasNext() {
            return cur != null;
        }
        @Override
        public E next() {
            E ret = cur.data;
            cur = cur.next;
            return ret;
        }}
}

双向循环链表

       双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。

 头尾添加元素

当表中无元素,直接添加

 头部添加:

 尾部

中间

 

 删除元素

头部删:

 尾部:

 中间

 代码

//双向循环链表
public class LinkedList<E> implements LinearTable<E> {
    private class Node {
        E data;
        Node pre;   //直接前驱
        Node next;  //直接后继

        public Node() {
            this(null, null, null);
        }

        public Node(E data) {
            this(data, null, null);
        }

        public Node(E data, Node pre, Node next) {
            this.data = data;
            this.pre = pre;
            this.next = next;
        }

        @Override
        public String toString() {
            return data.toString();
        }
    }

    private Node head;
    private Node tail;
    private int size;

    public LinkedList() {
        head = null;
        tail = null;
        size = 0;
    }

    public LinkedList(E[] arr) {
        if (arr == null) {
            throw new IllegalArgumentException("arr can not be null");
        }
        for (E e : arr) {
            add(e);
        }
    }

    @Override
    public void add(E element) {
        add(size, element);
    }

    @Override
    public void add(int index, E element) {
        if (index < 0 || index > size) {
            throw new IllegalArgumentException("add index out of range");
        }
        Node n = new Node(element);
        //如果链表为空,n为新增结点,
        if (size == 0) {
            head = n;  //头指针指向新结点
            tail = n;  //尾指针指向新结点
            tail.next = head; //新结点的前驱指向自己
            head.pre = tail; //新结点的后继指向自己
        }//在表头添加,先解决新结点的前驱,然后解决新结点和原首结点的关系,在解决新结点的后继问题
        else if (index == 0) {
            n.pre = head.pre; //将新结点的前驱等于原首结点的前驱
            n.next = head;   //新结点的后继指向原首结点
            head.pre = n; //因为此时的head还是指向原首结点,因为在原首结点前加个新结点,所以原首结点的前驱是新结点,所以原结点指向前驱
            head = n; // head指向新结点
            tail.next = head; //因为是循环链表,那么原来的tail现在应指向新结点
        }//在表尾添加,先解决新尾结点的后继指向原结点,再解决新尾结点和旧结点的关系,再解决首结点的前驱问题
        else if (index == size) {
            n.next = tail.next;//在末尾添加,将新结点的后继指向首结点,因为原来的tail.next指向的就是首结点
            tail.next = n; //然后将原尾结点的后继指向新结点
            n.pre = tail; //新结点的前驱指向原尾结点
            tail = n;     //将tail指向新尾结点
            head.pre = tail; //既然是循环链表那么首结点的前驱指向新结点
        }//在表中添加
        else {
            Node p, q;//定义两个指针p,q.
            if (index <= size / 2) {   //为了方便寻找插入点,如果插入点小于等于有效结点的2/1,则在前半部分
                p = head; //p从首结点开始
                for (int i = 0; i < index - 1; i++) { //这里为什么是index-1,是因为是要在原来的位置2结点前插入一个结点
                    p = p.next;//每遍历一次,p指向下一次后继
                }//此时找到p的位置
                q = p.next;  //找到q的位置
                p.next = n; //p的后继指向新结点n
                n.pre = p;  //n的前驱指向p
                q.pre = n;   //q的前驱指向n
                n.next = q; //n的后继指向q
            } else //当添加的结点属于后部分
                 {
                p = tail;   //将p指向尾结点
                for (int i = size - 1; i > index; i--) {//为何size-1:因为p已经是尾结点,所以从-1开始遍历,为什么不index-1因为添加是在找到的位置前面增加不需要-1
                    p = p.pre;//每遍历一次指一次前驱,直到找到位置
                }//p找到了插入的位置
                q = p.pre;//找到q的位置
                q.next = n;//q的后继指向n
                n.pre = q;//n的前驱指向q
                n.next = p;//n的后继指向p
                p.pre = n;//p的前驱指向n
            }
        }
        size++;
    }

    @Override
    public void remove(E element) {
        int index = indexOf(element);//找到element的位置
        if (index != -1) {
            remove(index);
        }
    }

    @Override
    public E remove(int index) {
        if (index < 0 || index >= size) {
            throw new IllegalArgumentException("remove index out of range");
        }
        E ret = null;  //定义了ret为null
        Node node; //定义了一个结点
        //当表中只有一个结点
        if (size == 1) {
            ret = head.data; //将头结点的数据域为null
            head = null;//头指针为空
            tail = null;//尾指针为空
        }//在表头删除
        else if (index == 0) {
            ret = head.data; //将首结点的数据域给ret
            node = head.next;//将头指针的下一个等于node
            head.next = null;//将原来的头指针的下一个为空
            node.pre = head.pre;//将node的前驱指向头指针的前驱
            head.pre = null;//将删除结点的指向前驱指针为null
            head = node;//头指针指向node
            tail.next = head;//尾指针指向node
        }//在表尾删除
        else if (index == size - 1) {
            ret = tail.data;//将首结点的数据域给ret
            node = tail.pre;//将尾指针的前驱为node(找到node)
            tail.pre = null;//尾结点的指向前驱的指针为空
            node.next = tail.next;//原尾结点的后继指针给node后继指针
            tail.next = null;//原尾结点的的后继指针为空
            tail = node;//尾指针指向node
            head.pre = tail;//头结点的前驱指针指向尾结点node
        }//在表中删除
        else {
            Node p, q, r;    //q为删除的结点,p为删除结点的前驱,r为删除结点的后继
            if (index <= size / 2) {// 若果在前半部分
                p = head;//p指向头结点
                for (int i = 0; i < index - 1; i++) {
                    p = p.next;
                }//找到p,此时的p是删除的结点的前驱
                q = p.next;//确定删除结点q的位置
                r = q.next;//找到删除结点q的后继r的位置
                ret = q.data;//将删除结点q的数据域给ret
                p.next = r;//将p的后继指向r
                r.pre = p;//将r的前驱指向p
                q.next = null;//将q的后继为null
                q.pre = null;//将q的前驱为null
            } else { //若果在后半部分
                p = tail;//将p指向尾结点
                for (int i = size - 1; i > index + 1; i--) {
                    p = p.pre;
                }
                q = p.pre;
                r = q.pre;
                ret = q.data;
                r.next = p;
                p.pre = r;
                q.next = null;
                q.pre = null;
            }
        }
        size--;
        return ret;
    }

    @Override
    public E get(int index) {
        if (index < 0 || index >= size) {
            throw new IllegalArgumentException("get index out of range");
        }
        if (index == 0) {
            return head.data;
        } else if (index == size - 1) {
            return tail.data;
        } else {
            Node p = head;
            for (int i = 0; i < index; i++) {
                p = p.next;
            }
            return p.data;
        }
    }
//修改
    @Override
    public E set(int index, E element) {
        if (index < 0 || index >= size) {
            throw new IllegalArgumentException("set index out of range");
        }
        E ret = null;
        if (index == 0) {
            ret = head.data;
            head.data = element;
        } else if (index == size - 1) {
            ret = tail.data;
            tail.data = element;
        } else {
            Node p = head;
            for (int i = 0; i < index; i++) {
                p = p.next;
            }
            ret = p.data;
            p.data = element;
        }
        return ret;
    }

    @Override
    public int size() {
        return size;
    }

    @Override
    public int indexOf(E element) {
        Node p = head;
        int index = 0;
        while (!p.data.equals(element)) {
            p = p.next;
            index++;
            if (p == head) {
                return -1;
            }
        }
        return index;
    }

    @Override
    public boolean contains(E element) {
        return indexOf(element) != -1;
    }


    @Override
    public boolean isEmpty() {
        return size == 0 && head == null && tail == null;
    }


    @Override
    public void clear() {
        head = null;
        tail = null;
        size = 0;
    }

    @Override
    public void sort(Comparator<E> c) {
        if (c == null) {
            throw new IllegalArgumentException("comparator can not be null");
        }
        //插入排序来做
        if (size == 0 || size == 1) {
            return;
        }
        for (Node nodeA = head.next; nodeA != head; nodeA = nodeA.next) {
            E e = nodeA.data;
            Node nodeB;
            Node nodeC;
            for (nodeB = nodeA, nodeC = nodeB.pre; nodeC != tail && c.compare(nodeC.data, e) > 0; nodeB = nodeB.pre, nodeC = nodeC.pre) {
                nodeB.data = nodeC.data;
            }
            nodeB.data = e;
        }
    }

    @Override
    public List<E> subList(int fromIndex, int toIndex) {
        if (fromIndex < 0 || toIndex >= size || fromIndex > toIndex) {
            throw new IllegalArgumentException("0 <= fromIndex <= toIndex < size");
        }
        Node nodeA = head;
        for (int i = 0; i < fromIndex; i++) {
            nodeA = nodeA.next;
        }
        Node nodeB = head;
        for (int i = 0; i < toIndex; i++) {
            nodeB = nodeB.next;
        }
        Node p = nodeA;
        LinkedList<E> list = new LinkedList<>();
        while (true) {
            list.add(p.data);
            if (p == nodeB) {
                break;
            }
            p = p.next;
        }
        return (List<E>) list;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append('[');
        if (isEmpty()) {
            sb.append(']');
        } else {
            Node p = head;
            while (true) {
                sb.append(p.data);
                if (p == tail) {
                    sb.append(']');
                    break;
                }
                sb.append(',');
                sb.append(' ');
                p = p.next;
            }
        }
        return sb.toString();
    }

    @Override
    public Iterator<E> iterator() {
        return new LinkedListIterator();
    }

    class LinkedListIterator implements Iterator<E> {
        private Node cur = head;
        private boolean flag = true; //是否在第一圈

        @Override
        public boolean hasNext() {
            if (isEmpty()) {
                return false;
            }
            return flag;
        }

        @Override
        public E next() {
            E ret = cur.data;
            cur = cur.next;
            if (cur == head) {
                flag = false;
            }
            return ret;
        }
    }
}

特征选择/筛选方法总结 作者:jliang https://blog.youkuaiyun.com/jliang3 1.特征选择介绍 1)特征分类 相关特征:对于学习任务(例如分类问题)有帮助,可以提升学习算法的效果; 无关特征:对于我们的算法没有任何帮助,不会给算法的效果带来任何提升; 冗余特征:不会对我们的算法带来新的信息,或者这种特征的信息可以由其他的特征推断出; 2)特征选择的目的 对于一个特定的学习算法... 阅读详情

相关推荐

深入解析Uplift模型评估:AUUC指标的计算与应用

本文深入解析了Uplift模型评估的核心指标AUUC。针对传统响应模型无法区分用户真实转化动因的痛点,AUUC通过量化模型对用户增益(Uplift)的排序能力,有效衡量营销干预的增量收益。文章详细拆解了AUUC的计算逻辑,从构建Qini曲线到Python代码实战,并强调了其在预算约束下的精准营销等场景的应用价值与常见陷阱。

weixin_29254029的博客 475

Java中链表的头节点

一个链表头节点为headhead     1     2     3     4     5     6head叫做链表的头节点1所在的节点叫做链表的首节点(不知叫法是否准确)从定义上严格来说头节点head本身并没有值,它只是一个指向首节点1的指针。也就是说head.val为空,head.next.val=1。即head的下一个节点才是1的节点。那上述的链表就有7个节点(包含头节点head)。 但...

sofuzi的博客 1万+

win10 运行lisflood_8踩过的坑

1、安装cuda及VS2019 https://www.bilibili.com/read/cv7335974/ 2、netcdf.h头文件找不到问题 https://www.cnblogs.com/lyggqm/p/12926974.html https://blog.youkuaiyun.com/u011954296/article/details/54617048 3、编码问题 https://blog.youkuaiyun.com/qq_33485434/article/details/81196843 4、

我的笔记 4115

数据结构:Java实现循环单链表(超详细)

java实现循环链表 实现一个循环链表(单链表),具备增加元素、删除元素、打印循环链表等功能。 一丶单向循环链表 就是为尾节点指向头结点 二丶单向循环链表的接口设计 比较单向链表,单向循环链表只需要修改添加节点,删除节点两个方法,也就是add和remove方法 三丶单向循环链表的实现 3.1添加节点 相比于单向链表,单向循环链表只需要特别关注插入头结点的情况即可 需要考虑的特殊情况是当链表的长度为0的时候的插入的情况 创建节点类 package LoopTable;...

qq_51066068的博客 7806

Zemax热分析实战:5分钟搞定双胶合透镜温度漂移优化(附操作数详解)

本文详细解析了使用Zemax进行光学系统热分析的全流程,以双胶合透镜为例,重点阐述了如何通过多重结构编辑器模拟温度变化,并利用关键操作数优化系统以抵抗温度漂移。文章提供了从基础设置到高级优化的实战技巧,帮助工程师快速掌握无热化设计方法,确保系统在宽温范围内保持稳定成像性能。

n4o5p6q7r的博客 398

PX4实战(四):PX4 uorb模块详解

本节主要讲解PX4中的uorb消息,主要包括uorb的基本概念使用、PX4内重要的uorb消息、如何自定义uorb消息以及使用uorb消息的注意点等,其中讲解重要uorb消息是为了对PX4内重要数据结构有初步的了解,有助于后期算法理解。uORB(micro Object Request Broker)是PX4中用于模块间通信的轻量级发布-订阅(Publish/Subscribe)机制。模块之间可以通过uORB传递消息,无需直接调用对方函数;提高系统模块化与解耦性;

PX4-SLAM-PNC 1932

(java)链表中head是什么,区分有头结点、无头结点链表,易懂

java链表head含义,易懂,头结点

qq_63872246的博客 758

伺服系统控制原理深度解析

摘要:本文系统阐述了伺服系统的控制原理与应用。首先介绍了伺服系统的定义、组成及其在工业自动化中的重要性;然后详细分析了反馈控制机制、稳定性判据和性能指标;重点推导了传递函数和状态空间两种数学模型,并通过LaTeX公式展示了二阶系统建模过程;进而对比了PID控制、状态反馈及自适应控制等方法的优缺点;最后结合数控机床等案例,验证了理论方法的有效性,并展望了伺服系统智能化发展趋势。全文兼顾理论深度与实践指导性,为控制工程领域提供了系统的技术参考。

技术工作者 1266

java head 请求_接口请求的六种常见方式详解(get、post、head等)

一.接口请求的六种常见方式:1、Get 向特定资源发出请求(请求指定页面信息,并返回实体主体)2、Post 向指定资源提交数据进行处理请求(提交表单、上传文件),又可能导致新的资源的建立或原有资源的修改3、Put 向指定资源位置上上传其最新内容(从客户端向服务器传送的数据取代指定文档的内容)4、Head 与服务器索与get请求一致的相应,响应体不会返回,获取包含在小消息头中的原信息(与get请求类...

weixin_39633089的博客 3785

8.9华为OD机试真题 新系统 - 查找最佳充电策略 (Java/Py/C/C++/Js/Go)

8.9华为OD机试真题 新系统 - 查找最佳充电策略 (Java/Py/C/C++/Js/Go)

算法大师! 1171

AMDGPU IH(Interrupt Handler)实现分析

AMDGPU IH环形缓冲区机制是显卡驱动中高效处理GPU硬件中断的核心架构。该机制通过环形缓冲区存储中断事件,利用读写指针(wptr/rptr)同步硬件与驱动间的数据交互。硬件写入事件后驱动遍历处理,通过指针掩码实现环形循环,并具备溢出检测和虚拟化环境下的重置保护。其优势在于批量处理降低中断开销,指针同步确保可靠性,支持多队列扩展和SR-IOV虚拟化场景,为GPU中断管理提供了高性能基础架构。

图形/计算GPU的驱动与虚拟化技术分享园地 1639

JVM内存--堆(head),栈(stack),方法区(method)

了解JVM具体的概念:JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method) 堆区:1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身栈区:1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(...

weixin_30307921的博客 731

ESP32-IDF开发实例-外部Flash与FatFs文件系统数据存取

FatFs是用于小型嵌入式系统的通用FAT / exFAT文件系统模块。FatFs模块是按照ANSI C(C89)编写的,并且与磁盘I/O层完全分开。因此,它独立于平台。它可以并入资源有限的小型微控制器中,例如8051,PIC,AVR,ARM,Z80,RX等。ESP32-IDF对FatFs提供了良好的支持。

视觉与物联智能 2917

Java——数据结构之双向链表

文章目录1.单链表的实现(1)定义一个节点类型(2)头插法(3)尾插法(4)根据下标插入节点(5)查找关键字(6)删除第一次出现的关键字(7)删除所有出现的关键字key(8)节点的回收(9)链表打印展示2.完整代码展示完!   接上篇Java——数据结构之单链表   在之前的学习中,我们主要了解了很多 Java 的 基本语法,但是 在之后的 Java学习中,了解 基础 数据结构的知识 非常重要,数据结构的思想 可以帮助我们更加清晰 明白的了解 Java 的解题思路等等。   今天我们就来开始学习 实现一

rain67的博客 2659

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

java版数据结构之链表

链表是一种线性数据结构,由节点(Node)数据域:存储元素值。指针域:存储指向下一个(或上一个)节点的引用。示例(单链表节点结构):T data;示例(单链表):​} else {= null) {size++;​// 其他方法(如addFirst、remove等)类似实现。

2301_79418644的博客 721

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Java——数据结构之单链表

文章目录Java——数据结构之单链表1. 链表的概念及结构2.单链表的实现(1)定义一个节点类型(2)头插法(3)尾插法(4)根据下标插入节点(5)查找关键字(6)删除第一次出现的关键字(7)得到单链表的长度(8)单链表打印展示(9)节点的回收3.完整代码的展示完! Java——数据结构之单链表 本次内容介绍大纲   在之前的学习中,我们主要了解了很多 Java 的 基本语法,但是 在之后的 Java学习中,了解 基础 数据结构的知识 非常重要,数据结构的思想 可以帮助我们更加清晰 明白的了解 Ja

rain67的博客 2655

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

数据结构之链表(Java实现)

数据结构中线性表的重要知识之一

Easenyang的博客 9317

Java数据结构--链表

一起学习编程的友友们,我以及经历JavaSE的学习到了数据结构这个篇章,在数据结构中我们了解时间和空间复杂度的是什么以及怎么计算。到数据结构的一个重点篇---链表是一种存储结构,数据元素的是通过链表中的次序实现的。链表有一系列(链表中每一个元素称为节点)组成,节点可以在运行时动态生成。每个节点包括两部分:一个是存储数据元素的;另一个是存储下一个节点地址的。相比于线性顺序结构,操作复杂。

2401_86698066的博客 846

【Java数据结构】LinkedList-链表

此文章详细讲解数据结构:链表,以模拟LinkedList的视角去研究链表,学习单链表以及双向链表的基础知识,后续我们可以靠这些知识,进攻更难的oj题,更特殊的链表类型~

Carefree_State的博客 1748

java数据结构之链表

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

mr_yuanshen的博客 874

java链表数据结构是什么_JAVA数据结构之链表

/*(1)简单链表Java代码*///package ChapterFive;class Link {public E data;public Link next;public Link(E data){this.data = data;}}class LinkList {public Link first;//链表中数据项的个数public int size;public LinkList() ...

weixin_32487755的博客 180

【Java演示】什么是链表?数据结构(三)

目录链表:随机存储,顺序访问(读取)前言一、单向链表什么叫随机存储呢?链表的基本操作1. 查找节点2. 更新节点3. 插入节点3.1. 尾部插入3.2. 头部插入3.3. 中间插入4. 删除元素4.1. 尾部删除4.1. 头部删除4.1. 中间删除二、双向链表 链表:随机存储,顺序访问(读取) 前言 本博文的大部分插图来自于《漫画算法——小灰》,也复制了该书部分文字 我加了一些自己的总结、代码(...

子浩的博客 1万+

java数据结构链表_Java数据结构与算法——链表

声明:码字不易,转载请注明出处,欢迎文章下方讨论交流。前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督。本文介绍另一种数据结构——链表,包括链表的特点特点、链表的创建、删除、插入和输出,文末给出java代码和一道常见的关于链表的面试题。1、链表的概念和特点链表是由若干结点组成,每个结点至少包括两部分信息:一个是元素数据,一个是指向下一个(上一个)元素地址的指针。链表的存储在物理上是非...

weixin_39797264的博客 201

JAVA数据结构之链表

1、单链表的数据结构 单链表中的数据是以结点的形式存在,每一个结点是由数据元素(数据域)和下一个结点的存储的位置(指针域)组成。单链表与数组相比的最大差别是:单链表的数据元素存放在内存空间的地址是不连续的,而数组的数据元素存放的地址在内存空间中是连续的。具体的数据模型用下图大概描述一下。 2、单链表的优缺点 优点: 插入删除速度快、内存利用率高,不会浪费内存、大小没有固定,拓展很灵活 由于链表的节点在内存中可以存在任何地方、不要求连续,且每个节点中都存储着下一节点的内存地址。如果需要新插.

奔跑的路路 798

java 链表数据结构实现

java 链表数据结构说明本文适合初学java想要了解数据结构的人,操作正确下面的代码都是可以工作的,如果不能与我联系我会改。java没有指针,虽然没有办法直接访问内存,但是java中有引用,可以引用一块内存空间,所以我们可以用java的指针模型,来实现链表数据结构。我会构建两个类,在两个包中,IntNode类提供基本的操作,IntLinkBag类在IntNode类基础之上,提出了包的概念相当于节点的集合。

TrueSpiderBoy Blog 909

【Java数据结构】链表

1. 概况 链表在逻辑上是连续的,在物理上不一定连续。 分类: 单向、双向 带头、不带头 循环、非循环 2. 思路 data:数值域,里面存储的数据 next:引用变量 -> 下一个节点的地址 尾巴节点:当这个节点的next域为null的时候 头节点:整个链表当中的第一个节点 单向不带头非循环链表: 单向带头非循环链表: 单向不带头循环链表: 3. 定义链表节点 class Node { public int val; public...

Zincy星辰 2109
上一篇: java-数据结构-队列
下一篇: java-数据结构-排序
秃头泥猴
博客等级 码龄6年 9粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值