首页 > 其他分享 >数据结构 玩转数据结构 4-5 从链表中删除元素

数据结构 玩转数据结构 4-5 从链表中删除元素

时间:2022-10-29 20:12:23浏览次数:75  
标签:Node 10 return author 链表 玩转 2022 数据结构 public

0    课程地址

https://coding.imooc.com/lesson/207.html#mid=13448

 

1    重点关注

1.1    代码草图解析

 

 

 

 

2    课程内容


3    Coding

3.1    关键代码

  • 重点看删除功能点
/**
     * H        删除索引为index的元素
     * @author weidoudou
     * @date 2022/10/29 19:40
     * @param index 请添加参数描述
     * @return E
     **/
    public E delete(int index){
        if(index<0||index>size-1){
            throw new IllegalArgumentException("索引越界");
        }

        Node pre = dummyHead;
        for(int i = 0;i<index;i++){
            pre = pre.next;
        }

        Node ret = pre.next;
        pre.next = ret.next;
        ret.next = null;
        size--;

        return ret.e;
    }

 

 

3.2    全量代码(遍历查询和修改)

  • 全量代码
package com.company;

/***
 * 链表
 * @author weidoudou
 * @date 2022/10/28 7:56
 **/
public class LinkedList<E> {

    /**
     * 1  内部类node
     * @author weidoudou
     * @date 2022/10/28 7:59
     * @return null
     **/
    private class Node{
        //Node 只有两个属性,下一个节点和本节点存储的元素
        private E e;
        private Node next;

        /**
         * 通用调用node方法
         * @author weidoudou
         * @date 2022/10/28 8:17
         * @param e 请添加参数描述
         * @param  next 请添加参数描述
         * @return null
         **/
        public Node(E e,Node next){
            this.e = e;
            this.next = next;
        }

        /**
         * node 无参构造
         * @author weidoudou
         * @date 2022/10/28 8:15
         * @return null
         **/
        public Node(){
            this(null,null);
        }

        /**
         * node 有参构造
         * @author weidoudou
         * @date 2022/10/28 8:16
         * @param e 请添加参数描述
         * @return null
         **/
        public Node(E e){
           this(e,null);
        }


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

    //2 LinkedList 属性 链表头元素(火车头),大小
    private int size;
    private Node dummyHead;

    /**
     * 3    LikedList 无参
     * @author weidoudou
     * @date 2022/10/28 8:27
     * @return null
     **/
    public LinkedList() {
        this.dummyHead = new Node(null,null);
        this.size = 0;
    }

    /**
     * 4  getSize
     * @author weidoudou
     * @date 2022/10/28 8:23
     * @return null
     **/
    public int getSize(){
        return size;
    }

    /**
     * 5  isEmpyt
     * @author weidoudou
     * @date 2022/10/28 8:24
     * @return boolean
     **/
    public boolean isEmpty(){
        return size == 0;
    }

    /**
     * 6  链表头部添加元素
     * @author weidoudou
     * @date 2022/10/28 8:37
     * @param e 请添加参数描述
     * @return void
     **/
    public void addFirst(E e){
        /*Node nodeNew = new Node(e);
        nodeNew.next = head;    //火车尾指向 上个尾巴
        this.head = nodeNew;    //火车尾 变成了当前的node*/

        //称之为优雅写法
        addElement(0,e);
    }

    /**
     * 7  链表尾部添加元素 认真分析下
     * @author weidoudou
     * @date 2022/10/28 18:11
     * @param e 请添加参数描述
     * @return void
     **/
    public void addLast(E e){
        addElement(size,e);
    }

    /**
     * 8  链表添加元素(链表通常不在中间添加元素,编写此段代码完全是为了后续便于理解和二叉树相关知识做铺垫)
     * @author weidoudou
     * @date 2022/10/28 8:45
     * @param index 请添加参数描述
     * @param  e 请添加参数描述
     * @return void
     **/
    public void addElement(int index,E e){
        if(index<0||index>size){
            throw new IllegalArgumentException("索引不正确");
        }


        Node pre = dummyHead;
        for(int i = 0;i<index;i++){
            pre = pre.next;
        }

        /*Node nodeNew = new Node(e);
        nodeNew.next = pre.next;
        pre.next = nodeNew;*/

        //优雅写法
        pre.next = new Node(e,pre.next);
        size++;
    }

    /**
     * 9    查询
     * @author weidoudou
     * @date 2022/10/29 11:18
     * @param index 请添加参数描述
     * @return E
     **/
    public E findByIndex(int index){
        if(index<0||index>size-1){
            throw new IllegalArgumentException("索引越界");
        }

        Node cur = dummyHead.next;
        for(int i = 0;i<index;i++){
            cur = cur.next;
        }
        return cur.e;
    }

    /**
     * A     查询首个元素
     * @author weidoudou
     * @date 2022/10/29 11:27
     * @return E
     **/
    public E findByFirst(){
        return findByIndex(0);
    }

    /**
     * B     查询最后一个元素
     * @author weidoudou
     * @date 2022/10/29 11:27
     * @return E
     **/
    public E findByLast(){
        return findByIndex(size-1);
    }

    /**
     * C     修改
     * @author weidoudou
     * @date 2022/10/29 11:29
     * @param index 请添加参数描述
     * @param  e 请添加参数描述
     * @return void
     **/
    public void update(int index,E e){
        if(index<0||index>size-1){
            throw new IllegalArgumentException("索引越界");
        }

        Node cur = dummyHead.next;
        for(int i = 0;i<index;i++){
            cur = cur.next;
        }
        cur.e = e;

    }

    /**
     * D     修改第一个元素
     * @author weidoudou
     * @date 2022/10/29 11:31
     * @param e 请添加参数描述
     * @return void
     **/
    public void updateFirst(E e){
        update(0,e);
    }

    /**
     * E    修改最后一个元素
     * @author weidoudou
     * @date 2022/10/29 11:31
     * @param e 请添加参数描述
     * @return void
     **/
    public void updateLast(E e){
        update(size-1,e);
    }

    /**
     * F     查询链表是否包含元素
     * @author weidoudou
     * @date 2022/10/29 13:04
     * @param e 请添加参数描述
     * @return boolean
     **/
    public boolean contains(E e){
        boolean flag;

        for(Node cur = dummyHead.next;cur!=null;cur=cur.next){
            if(e.equals(cur.e)){
                return true;
            }
        }
        return false;
    }

    /**
     * G      toString
     * @author weidoudou
     * @date 2022/10/29 13:06
     * @return java.lang.String
     **/
    @Override
    public String toString() {

        StringBuilder sb = new StringBuilder();
        for(Node cur = dummyHead.next;cur!=null;cur=cur.next){
            sb.append(cur+"->");
        }
        sb.append("Null");
        return sb.toString();
    }

    /**
     * H        删除索引为index的元素
     * @author weidoudou
     * @date 2022/10/29 19:40
     * @param index 请添加参数描述
     * @return E
     **/
    public E delete(int index){
        if(index<0||index>size-1){
            throw new IllegalArgumentException("索引越界");
        }

        Node pre = dummyHead;
        for(int i = 0;i<index;i++){
            pre = pre.next;
        }

        Node ret = pre.next;
        pre.next = ret.next;
        ret.next = null;
        size--;

        return ret.e;
    }
}

 

  • 测试类
package com.company;


public class Main {

    public static void main(String[] args) {

        LinkedList<Integer> linkedList = new LinkedList<>();
        for(int i = 0;i<5;i++){
            linkedList.addFirst(i);
            System.out.println(linkedList);
        }

        System.out.println("是否包含222="+linkedList.contains(222));

        linkedList.addElement(1,222);
        System.out.println(linkedList);

        System.out.println("是否包含222="+linkedList.contains(222));

        linkedList.delete(1);
        System.out.println(linkedList);


    }
}

 

  • 测试结果
0->Null
1->0->Null
2->1->0->Null
3->2->1->0->Null
4->3->2->1->0->Null
是否包含222=false
4->222->3->2->1->0->Null
是否包含222=true
4->3->2->1->0->Null

Process finished with exit code 0

 

标签:Node,10,return,author,链表,玩转,2022,数据结构,public
From: https://www.cnblogs.com/1446358788-qq/p/16839543.html

相关文章

  • 算法题:25. K 个一组翻转链表 (困难)一次AC(题目+思路+代码+注释)
    题目K个一组翻转链表给你链表的头节点head,每k个节点一组进行翻转,请你返回修改后的链表。k是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k的整数倍,那......
  • 第1章 欢迎来到 Python3 玩转机器学习
     1-1导学                                               ......
  • 双向链表
    双向链表packagecom.doubleLikedlist;importcom.doubleLikedlist.hero;publicclassdoubleLikedlist{privateheroheadnode=newhero(001,"");public......
  • 双向链表
    双向链表双向链表简介链表有多种不同的类型,本节介绍双向链表。双向链表和普通链表的区别在于,在链表中,一个节点只有链向下一个节点的链接;而在双向链表中,链接是双向的:一个......
  • 【数据结构-数组】数组的基本操作
    目录1数据结构定义2插入操作3删除操作4按值查找1数据结构定义#defineMAX50typedefstruct{intdata[MAX];intlength;}SqList;初始化:voidIni......
  • 代码随想录算法训练营第三天 | 203.移除链表元素 、707.设计链表、 206.反转链表
    链表这个数据结构我很少用到,本科的时候学过忘的都差不多了,感谢知道了可以直接添加一个虚拟头的操作!203.移除链表元素  707.设计链表: 206.反转链表未完成 ......
  • 网络安全(一):信息收集之玩转nmap(理论篇)
    更新时间2022年09月06日16:20:10完成nmap介绍,目标选择,主机发现部分2022年10月28日21:19:20完成最基本的内容,端口扫描,版本和系统探测,安全其他等打算的更新计划:更多......
  • 使用数据结构中的队列解决舞伴搭配问题
    ​ (一)问题描述某班有m个女生,n个男生(m不等于n,男女生人数和不能小于20),现要举办一个舞会,男女生分别编号坐在舞池两边的椅子上等待。每曲开始时,依次从男生和女生中各出一......
  • 数据结构 树(第10-14天)
    树的题目太多了,先总结一下树的遍历方式。按照根节点的遍历顺序。可以分为前序、中序、后序。前序遍历,即根–>左–>右的顺序。中序遍历,左–>根–>右。后续遍历,左–>右–>......
  • 数据结构 栈 / 队列(第9天)
    20.有效的括号判断输入的括号是否有效。左右括号··能闭合,顺序合适。思路:用栈实现。遇到左括号就保存在栈中,遇到右括号则需要从栈中弹出一个括号,与之配对。classSolutio......