链表(1)

本文介绍了链表这一动态数据结构的基本概念,强调了它在学习复杂数据结构如二叉树和trie中的重要性。链表允许动态添加和删除元素,但失去了随机访问的能力。通过虚拟头结点解决了在链表头部操作的特殊问题,简化了代码实现。文中还详细讲解了链表的增删查改操作,并提供了相关代码示例,包括在特定位置插入和删除元素,以及获取、替换和查找元素的方法。
摘要由CSDN通过智能技术生成

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

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

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

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

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

增加

1.在头部添加

 2.在尾部添加

 3.在中间进行添加:

 

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

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

 

 public void addHead(T ele) {
        this.add(0, ele);
    }

    public void addTail(T ele) {
        this.add(this.size, ele);
    }

    // 在指定位置添加结点, 关键点: 找到待插入位置的前一个结点
    public void add(int index, T ele) {
        if (index < 0 || index > this.size) {
            throw new IllegalArgumentException("index is invalid!");
        }
        Node node = new Node(ele);

        // 给链表增加一个虚拟头结点, 解决在链表的头部添加时的特殊处理
        Node dummyHead = new Node(null);
        dummyHead.next = head;
        Node prev = dummyHead;
        for (int i = 0; i < index; i++) {
            prev = prev.next;
        }
        node.next = prev.next;
        prev.next = node;
        // 更新头结点
        head = dummyHead.next;
        this.size++;
    }

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

删除:

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

 在中间进行删除:

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


 //将链表中的元素进行删除
    public void delete(int index) {
        if (index < 0 || index >= this.size) {

        }
        //无虚拟头结点
//        if (index == 0) {
//            Node delnode = head;
//            head = delnode.next;
//            delnode.next = null;
//            this.size--;
//        } else {
//            Node pre = head;
//            Node cur = pre.next;
//            for (int i = 1; i < index; i++) {
//                pre = pre.next;
//                cur=cur.next;
//            }
//            Node delnode =cur;
//            pre.next = delnode.next;
//            delnode.next = null;
//            this.size--;
//            cur = cur.next;

            //有虚拟头节点
        Node dummyNode=new Node(null);
        dummyNode.next=head;
        Node pre=dummyNode;
        Node cur=pre.next;
        for (int i = 0; i < index; i++) {
            pre=pre.next;
            cur=cur.next;
        }
        Node delnode =cur;
            pre.next = delnode.next;
            delnode.next = null;
            this.size--;
            cur = cur.next;
        }

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

      //根据索引找对应的元素
    public T get(int index){
        if(index<0||index>=this.size){
            return null;
        }
        Node cur=head;
        for (int i = 0; i < index; i++) {
            cur=cur.next;
        }
        return cur.ele;
    }
//获取头节点的元素
    public T getFirst(){
       return get(0);
    }
    //获取尾结点的元素
    public T getLast(){
        return get(this.size-1);
    }
   //判断是否包含该元素
    public boolean contain(T ele){
        Node cur=head;
        for (int i = 0; i < this.size; i++) {
           if(cur.ele.compareTo(ele)==0){
               return true;
           }
             cur=cur.next;
        }
        return false;
    }
    //将链表中的某个元素进行替换
    public void set(T ele,int index) {
        if(index<0||index>=this.size){
        }
        Node cur=head;
        for (int i = 0; i < index; i++) {
            cur=cur.next;
        }
        cur.ele=ele;
    }

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃橘子的Crow

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值