码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 数据结构-单链表的代码实现


    单链表是比较简单的链表,构成单链表的只有当前节点和下一节点处理,最后需要形成1-2-3-4将所有数据串联在一起。

    假如你要存储1,那么当前节点是1,下一个节点是空,因为你不知道下一个节点,然后再存储个2,这时当前节点是2,那么你就需要修改上一个节点1的下一个节点就是2,其实这个是很简单的,通过一个变量每一次存储当前的值,等到下一个值过来,我们取的时候就是上一个值,我们来实现一下。

    首先我们定义一个MyLinked类,类里再创建一个内部类Node,Node作为链表定义。

    item为当前节点,next为下一节点

    1. public class MyLinked {
    2. // 定义一个内部节点类
    3. private static class Node{
    4. // 当前节点
    5. E item;
    6. // 下一节点链表
    7. Node next;
    8. public Node(E item,Node next){
    9. this.item=item;
    10. this.next=next;
    11. }
    12. }
    13. }

    1.增加节点

    我们需要添加操作将链表上链,调用add方法,第一次会把数据放入头结点first全局变量中,然后把最新的节点也就是最后一个节点放入last中,这样每次调用add,最后的节点都可当上一个节点使用,这样判断完毕直接再l.next赋值最新的数据,就全部串连起来了,最后打印下链表的元素

    1. // 头结点
    2. private Node first;
    3. // 最后一个节点
    4. private Node last;
    5. // 添加链表元素
    6. private void add(Object e){
    7. // 将最后一个节点信息赋值给临时变量l,第一次时为空
    8. Node l=last;
    9. // 创建新的节点,只知道当前节点并不知道下一节点所以设置为空
    10. Node newNode=new Node(e,null);
    11. // 把每一个最新的节点赋值给last全局变量
    12. last=newNode;
    13. if (l==null){
    14. // 将头节点存储节点
    15. first=newNode;
    16. }else{
    17. // 因为是引用类型所以这里l.next则直接会再下一个节点穿连新节点,将节点串起来
    18. l.next=newNode;
    19. }
    20. }
    21. // 打印链表元素
    22. private void printLink(){
    23. Node f=first;
    24. while (f!=null){
    25. System.out.print("-"+f.item);
    26. f=f.next;
    27. }
    28. System.out.println("");
    29. }
    30. public static void main(String[] args) {
    31. System.out.println("往链表添加元素:");
    32. MyLinked myLinked=new MyLinked();
    33. myLinked.add(1);
    34. myLinked.add(2);
    35. myLinked.add(3);
    36. myLinked.printLink();
    37. }
    38. 打印完毕,数据已经排排座,手牵手存储好

       2.获取节点

      通过小标获取对应的节点信息,这个比较简单,其实就是根据小标进行循环,查找到下一个节点直到找到完毕

      1. /***
      2. * 根据索引获取单链表元素
      3. * @Param index 索引
      4. */
      5. private Object get(int index){
      6. Node node= getCommon(index);
      7. return node.item;
      8. }
      9. // 由于需要查询到元素的地方较多,做一个公共方法
      10. private Node getCommon(int index){
      11. if(index<0){
      12. return null;
      13. }
      14. Node get=first;
      15. for (int i=0;i
      16. get = get.next;
      17. }
      18. return get;
      19. }

      3.更改节点

      通过小标获取对应节点(调用公共方法),然后直接进行当前节点更新即可,怎么样简单把

      1. /**
      2. * 更新链表元素
      3. * @Param index 索引
      4. @Param e 待更改的元素
      5. */
      6. private void update(int index,Object e){
      7. Node node= getCommon(index);
      8. node.item=e;
      9. }

       

      4.删除节点

      1-2-3-4 假如我要删除2,我剩下1-3-4,也就是说要删除2,则要把1的next元素由2改为3即可,要删除3也是如此则需要知道3的节点并把3的next改为null。

      所以我们要定义上一个节点,每次循环把当前节点赋值,等到找到节点时则可使用prev.next将下一个节点处理即可。

      1. // 删除元素
      2. private void remove(Object obj) {
      3. // 前一个元素
      4. // 没有找到当前元素则把当前元素存起来等到下一个元素找到是要删除的则把此的.
      5. Node prev = null;
      6. // 要删除的元素为第一个元素则把第一个元素的下一个元素赋值为当前元素
      7. if(first.item.equals(obj)){
      8. first=first.next;
      9. }else {
      10. // 循环元素
      11. for (Node x = first; x != null; x = x.next) {
      12. if (obj.equals(x.item)) {
      13. if (x.next != null) {
      14. prev.next = x.next;
      15. break;
      16. }else{
      17. prev.next=null;
      18. }
      19. }
      20. prev = x;
      21. }
      22. }
      23. }

       main测试方法

      1. public static void main(String[] args) {
      2. System.out.println("往链表添加元素:");
      3. MyLinked myLinked = new MyLinked();
      4. myLinked.add(1);
      5. myLinked.add(2);
      6. myLinked.add(3);
      7. myLinked.printLink();
      8. System.out.println("获取链表里第二个元素元素:" + myLinked.get(1));
      9. System.out.print("更新链表元素:");
      10. myLinked.update(1, 4);
      11. myLinked.printLink();
      12. System.out.print("删除链表元素:");
      13. myLinked.remove(3);
      14. myLinked.printLink();
      15. }

      其实链表还是蛮简单的,多自己想想给你一个这样链表你怎么实现增删改查,然后和源码对照,这样熟悉此结构后对他的所有处理就会更简单熟练。

    39. 相关阅读:
      人生苦短,我用JRebel
      Redis实现Session持久化
      java 企业工程管理系统软件源码+Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis
      LINQ 查询
      IDEA的乱码与file.encoding = UTF-8
      java springboot+VUE OA企业办公自动化系统前后端分离开发mysql数据库web结构java编程计算机网页源码maven项目
      Spring的事件机制
      C++——如何正确的使用STL中list?
      kubernetes 调度
      Request(请求)&Response(响应)
    40. 原文地址:https://blog.csdn.net/dfBeautifulLive/article/details/127748546
      • 最新文章
      • 攻防演习之三天拿下官网站群
        数据安全治理学习——前期安全规划和安全管理体系建设
        企业安全 | 企业内一次钓鱼演练准备过程
        内网渗透测试 | Kerberos协议及其部分攻击手法
        0day的产生 | 不懂代码的"代码审计"
        安装scrcpy-client模块av模块异常,环境问题解决方案
        leetcode hot100【LeetCode 279. 完全平方数】java实现
        OpenWrt下安装Mosquitto
        AnatoMask论文汇总
        【AI日记】24.11.01 LangChain、openai api和github copilot
      • 热门文章
      • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
        奉劝各位学弟学妹们,该打造你的技术影响力了!
        五年了,我在 CSDN 的两个一百万。
        Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
        面试官都震惊,你这网络基础可以啊!
        你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
        心情不好的时候,用 Python 画棵樱花树送给自己吧
        通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
        13 万字 C 语言从入门到精通保姆级教程2021 年版
        10行代码集2000张美女图,Python爬虫120例,再上征途
      Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
      正则表达式工具 cron表达式工具 密码生成工具

      京公网安备 11010502049817号