单向链表的基本操作

2023-11-14

一、什么是单向链表

        单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。

 

a、 表元素域elem用来存放具体的数据。
b、链接域next用来存放下一个节点的位置。
c、变量p指向链表的头节点(首节点)的位置,从p出发能找到表中的任意节点。

二、链表基本操作的实现原理;

(1)、添加元素;

直接添加即在链表的末尾添加,又因底层是用LinkedList实现的,所以添加的方法为List的添加方法

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

(2)对应的角标处添加元素;

a、首先进行范围的判断处理如果添加的位置不在链表的范围内,则抛出异常;

b、先声明一个节点用来存储插入的元素。

c、判断插入位置,实现插入点前后的链接。

@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++;
    }

(3)删除元素

首先判断链表中是否有该元素,获取该元素的角标。移除对应角标处的元素;

@Override
    public void remove(E element) {
        int index = indexOf(element);
        if (index != -1) {
            remove(index);
        }
    }

(4)移除对应角标处的元素

a、先将需要删除的元素单独获取出来。

b、根据在链表中删除位置的不同,做出相应的操作;

@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;
    }

(5)获取相应角标处的元素

a、先对角标是否在链表中进行判断。

b、对在链表中不同位置处的元素获取进行相应操作。

 @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;
        }
    }

(6)修改对应角标处的元素

a、先对角标是否在链表中进行判断。

b、对在链表中不同位置处的元素修改进行相应操作。

@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;
    }

(7)获取链表中的元素个数

因底层用List实现,所以获取size 的方法和list的方法一致;

@Override
    public int size() {

        return size;
    }

(8)获取元素在链表中的角标

@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;
    }

(9)判断是否包含此元素

 @Override
    public boolean contains(E element) {

        return indexOf(element) != -1;
    }

(10)判断链表是否为空

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

(11)清空链表

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

(12)toString()

a、判空操作,如果为空则返回[]

b、如果不为空,则将链表中的所有元素拼接在[]中输出

 @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();
    }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单向链表的基本操作 的相关文章

  • 无名图书(网站)

    首先 这个电子书资源网站 里面的资源涵盖面广非常的齐全 包含有文学类 社会文化 历史 经济 自然科学 理工科 美食旅行 政治 计算机 设计 思想 健康 生物 建筑 绘本 天文等等 完全能满足日常使用需求 网站支持搜索功能 小伙伴们可以通过搜

随机推荐

  • Blender2.5快捷键

    Blender2 5快捷键 整理了最全面的快捷键和解释 希望大家继续补充 Basics 基础 CTRL U Save as Default 保存界面 Right Click Select 选择 Middle Click Pan 平移视角 M
  • python大作业爬虫_Python大作业---微博爬虫及简单数据分析

    刚开始学python 选了这个题目 把代码放上来留念 没有用到很流行的框架 所以代码量挺大 GUI用wxpython写的 coding UTF 8 import os import re import requests import sys
  • 上传本地jar包文件到私服

    一 公司的项目上传到公司私服 使用idea中maven的install将项目打包 放到本地仓库 install三个关键步骤 将项目打包成jar包放到项目的target目录下 这一步等同于mvn package命令的操作 将jar包insta
  • java 比较日期差值_日期的大小比较及差值计算

    一 LocalDate 的 isBefore isAfter 返回值为 boolean 类型 public static void main String args LocalDate ld LocalDate now LocalDate
  • Ubuntu系统下安装NVIDIA驱动

    介绍两种不同的方法 这两种方法基本不会出现任何问题 1 直接使用系统的apt get进行nvidia的安装 具体参考自这篇https blog csdn net breeze5428 article details 80013753 具体步
  • [论文阅读] (10)基于溯源图的APT攻击检测安全顶会总结

    娜璋带你读论文 系列主要是督促自己阅读优秀论文及听取学术讲座 并分享给大家 希望您喜欢 由于作者的英文水平和学术能力不高 需要不断提升 所以还请大家批评指正 非常欢迎大家给我留言评论 学术路上期待与您前行 加油 前一篇文章分享了S P201
  • 更新预告:chatGPT知识树。

    从一个知识点出发 无限扩展到无数个子知识点 是学习 了解其他行业知识 专业技能的利器 10分钟 就可以对一个行业 一个专业有大概 又专业的了解 简单列2个例子 让你感受下神的强大 上线时间 2023 9 7 体验地址 https ppwor
  • 浅谈Android原生开发现状,终究是错付了

    浅谈Android原生开发现状 终究是错付了 客户端3年内必死 小程序 跨端方案盛行 很多公司已经开始裁客户端了 这不是危言耸听 不少同行已经发声 客户端面临的危机前所未有 前端跨平台和小程序蚕食移动端市场 客户端行业内部内卷严重 同行一直
  • planet-lab平台的布置

    最近需要把国家自然基金项目赶快结题 所以导师也催的紧 正好自己也在研究网格和高性能计算 所以老板就把部署planet lab环境的任务交给我 鄙人英语很烂 所以花了很长时间的去读指导书 最后基本上搞定 但是还有问题 希望网友们能给我点解答
  • Android Binder 系统级使用demo

    Android System Binder Usage 添加系统级服务Java C Server Client https github com qianjigui android system service exampleAndroid
  • 华为OD机试 -自动售货系统(C++ & Java & JS & Python)

    描述 1 总体说明 考生需要模拟实现一个简单的自动售货系统 实现投币 购买商品 退币 查询库存商品及存钱盒信息的功能 系统初始化时自动售货机中商品为6种商品 商品的单价参见1 1规格说明 存钱盒内放置1元 2元 5元 10元钱币 商品数量和
  • 用户登录JWT技术,Redis存储token,登录拦截

    SpringBoot项目 用户登录JWT技术 登录拦截 1 JWT技术 登录使用JWT技术 jwt 可以生成 一个加密的token 做为用户登录的令牌 当用户登录成功之后 发放给客户端 请求需要登录的资源或者接口的时候 将token携带 后
  • 剑指offer-4-替换空格

    问题 请实现一个函数 将一个字符串中的每个空格替换成 20 例如 当字符串为We Are Happy 则经过替换之后的字符串为We 20Are 20Happy 方案 该问题如果采用暴力方法 从前往后遍历 如果遇到空格 开始整体数据向后移动2
  • 概率论【离散型二维变量与连续性二维变量(上)】--猴博士爱讲课

    5 离散型二维变量与连续性二维变量 上 1 8 已知二维离散型分布律 求 离散型直接看表 做题方法参考如下 2 8 已知二维离散型分布律 判断独立性 如果满足p xy p x p y 那么相互独立 则我们只需要验证每一个p xy p x p
  • 微信小程序 手写签名_微信小程序实现手写签字

    无纸化办公 这是老板对我的要求 然而有人现场执法文件全部电子化 只有签字部分让一个搞web的人有点儿头疼 不能为了这个找个人来开发app吧于是想到了小程序 对于一个新接触小程序的人来说还是有挑战性的 因为我第一次写小程序 还好有文档 所以思
  • Data Fabric,下一个风口?

    Data Fabric 又名数据经纬 是近期横空出世的一个概念 之前对其了解甚少 近期做了个小调研 对这一概念内涵与外延 产品及定位 业务与前景 未来及趋势等做了简单整理总结 分享给大家 1 什么是Data Fabric 前世今生 Data
  • 浙江工商大学python考试试卷_浙江工商大学期末考试试卷

    第 1 页 共 3 页 成本会计答案 A 一 单项选择题 每题 2 分 共 20 分 B D B D C D A B C C 二 多项选择题 每题 2 分 共 10 分 1 BCD 2 BCD 3 ABCDE 4 ACD 5 ABCDE 三
  • php curl 头部参数,Curl参数说明,curl_init()用法教程!(header头传送参数)

    发送请求 author xiaochuan param string url 请求地址 param array header header数据 param array data POST的数据 return string function
  • 【PyQT5 绑定函数的传参(connect)】

    PyQT5 绑定函数的传参 connect 带参数 emanlee 博客园
  • 单向链表的基本操作

    一 什么是单向链表 单向链表也叫单链表 是链表中最简单的一种形式 它的每个节点包含两个域 一个信息域 元素域 和一个链接域 这个链接指向链表中的下一个节点 而最后一个节点的链接域则指向一个空值 a 表元素域elem用来存放具体的数据 b 链