• 链表(1)


    我们以前学过的线性数据结构底层原理都是依托静态数组来实现的,今天我们讲学习一个最简单的动态数据结构---->链表!

    掌握链表有助于学习更加复杂的数据结构,例如:二叉树、trie

    链表的优点是不需要处理固定的问题,真正的动态,缺点是丧失了随机访问的能力

     在生活中可以形象表示链表的东西有很多,比如自行车车链

    在数据结构中我们学习的是他们的最基本的操作增删改查,下面让我们来逐步了解链表的实现

    增加

    1.在头部添加

     2.在尾部添加

     3.在中间进行添加:

     

    这种添加情况需要对在头结点进行添加时进行特别处理,比如判断头结点是否为空等

    进行虚拟头结点进行添加操作

     

    1. public void addHead(T ele) {
    2. this.add(0, ele);
    3. }
    4. public void addTail(T ele) {
    5. this.add(this.size, ele);
    6. }
    7. // 在指定位置添加结点, 关键点: 找到待插入位置的前一个结点
    8. public void add(int index, T ele) {
    9. if (index < 0 || index > this.size) {
    10. throw new IllegalArgumentException("index is invalid!");
    11. }
    12. Node node = new Node(ele);
    13. // 给链表增加一个虚拟头结点, 解决在链表的头部添加时的特殊处理
    14. Node dummyHead = new Node(null);
    15. dummyHead.next = head;
    16. Node prev = dummyHead;
    17. for (int i = 0; i < index; i++) {
    18. prev = prev.next;
    19. }
    20. node.next = prev.next;
    21. prev.next = node;
    22. // 更新头结点
    23. head = dummyHead.next;
    24. this.size++;
    25. }

    在增加和删除的时候需要知道操作位置上前节点pre,删除和查找不需要

    删除:

    在头部进行删除: 在尾部进行删除:

     在中间进行删除:

     使用虚拟头结点则不需要对头结点进行特殊操作

    1. //将链表中的元素进行删除
    2. public void delete(int index) {
    3. if (index < 0 || index >= this.size) {
    4. }
    5. //无虚拟头结点
    6. // if (index == 0) {
    7. // Node delnode = head;
    8. // head = delnode.next;
    9. // delnode.next = null;
    10. // this.size--;
    11. // } else {
    12. // Node pre = head;
    13. // Node cur = pre.next;
    14. // for (int i = 1; i < index; i++) {
    15. // pre = pre.next;
    16. // cur=cur.next;
    17. // }
    18. // Node delnode =cur;
    19. // pre.next = delnode.next;
    20. // delnode.next = null;
    21. // this.size--;
    22. // cur = cur.next;
    23. //有虚拟头节点
    24. Node dummyNode=new Node(null);
    25. dummyNode.next=head;
    26. Node pre=dummyNode;
    27. Node cur=pre.next;
    28. for (int i = 0; i < index; i++) {
    29. pre=pre.next;
    30. cur=cur.next;
    31. }
    32. Node delnode =cur;
    33. pre.next = delnode.next;
    34. delnode.next = null;
    35. this.size--;
    36. cur = cur.next;
    37. }

    在链表中也有一些方法需要让我们掌握,一下代码仅供参考:

    1. //根据索引找对应的元素
    2. public T get(int index){
    3. if(index<0||index>=this.size){
    4. return null;
    5. }
    6. Node cur=head;
    7. for (int i = 0; i < index; i++) {
    8. cur=cur.next;
    9. }
    10. return cur.ele;
    11. }
    12. //获取头节点的元素
    13. public T getFirst(){
    14. return get(0);
    15. }
    16. //获取尾结点的元素
    17. public T getLast(){
    18. return get(this.size-1);
    19. }
    20. //判断是否包含该元素
    21. public boolean contain(T ele){
    22. Node cur=head;
    23. for (int i = 0; i < this.size; i++) {
    24. if(cur.ele.compareTo(ele)==0){
    25. return true;
    26. }
    27. cur=cur.next;
    28. }
    29. return false;
    30. }
    31. //将链表中的某个元素进行替换
    32. public void set(T ele,int index) {
    33. if(index<0||index>=this.size){
    34. }
    35. Node cur=head;
    36. for (int i = 0; i < index; i++) {
    37. cur=cur.next;
    38. }
    39. cur.ele=ele;
    40. }

  • 相关阅读:
    1.代码审计大致规则
    Http与Restful之间的关系
    ssl教程易语言代码
    备战金九银十!2022Java面试必刷461道大厂架构面试真题汇总+面经+简历模板都放这了,注意划重点!!
    python练习Ⅱ--函数
    基于SpringBoot的在线小说阅读平台系统
    C++:程序设计实例
    uni-app:文本超出部分用省略号表示
    猫吃什么罐头好?2023质量口碑好的猫罐头推荐!
    JAVA基础——day04
  • 原文地址:https://blog.csdn.net/dfdbb6b/article/details/128063878