链表-真正的动态数据结构

2023-11-05

创建节点
    public class Node {
        T val;
        Node next;

        public Node(T val, Node next) {
            this.val = val;
            this.next = next;
        }

        public Node() {
            this(null, null);
        }

        public Node(T val) {
            this(val, null);
        }
    } 

创建一个空链表

    //创建链表
    public Node header;
    private int size;

    public MyLinkedList() {
        this.header = null;
        this.size = 0;
    }

在这里插入图片描述
数据存储在节点中。
优点:不需要处理固态容量问题,可动态扩容。
缺点:丧失随机访问的能力。

添加元素

表头添加元素

在这里插入图片描述

    //表头添加元素
    public void addHead(T val) {
        Node cur = new Node(val, null);
        cur.next = header;
        header = cur;
        this.size++;
    }
表尾添加元素

在这里插入图片描述

    //表尾添加元素
    public void addTail(T val) {
        Node cur = new Node(val, null);
        Node p = header;
        while (p != null) {
            p = p.next;
        }
        p.next = cur;
        this.size++;
    }

表任意位置添加元素
    public void add(int index, T val) {
        if (index < 0 || index > size) {
            throw new IllegalArgumentException("index is invalid!");
        }
        // 创建新结点
        Node node = new Node(val);
        // 1、先找pre
        //需要对头结点做特殊处理,原因是头结点没有pre(前驱结点)

        /* 添加虚拟头结点,保证链表中所有的结点都有pre*/
        Node dummyHeader = new Node(null, this.header);
        Node pre = dummyHeader;
        for (int i = 1; i <= index; i++) {
            pre = pre.next;
        }
        //2、、挂接
        node.next = pre.next;
        pre.next = node;
        //3、 更新头结点
        this.header = dummyHeader.next;
        // 3、更新size
        this.size++;
    } 
删除元素
    public void delete(int index)
    {
        if(index<0||index>this.size)return ;
        Node pre=this.header;
        int cnt=0;
        while(index!=cnt)
        {
            cnt++;
            pre=pre.next;
        }
        Node cur=pre.next;
        pre.next=cur.next;
        cur.next=null;
    }  
遍历链表
    @Override
    public String toString() {
        ArrayList<T> list = new ArrayList<>();
        Node cur = this.header;
        while (cur != null) {
            list.add(cur.val);
            cur = cur.next;
        }
        StringBuilder sb = new StringBuilder();
        for (T x : list) {
            sb.append(x + "--->");
        }
        sb.append("Null");
        return sb.toString();
    }
查询元素是否存在
    //查询元素在链表中是否存在
    public boolean contains(T val)
    {
        Node pre=this.header;
        while(pre!=null)
        {
            if(pre.val.equals(val))return true;
            else pre=pre.next;
        }
        return false;
    }  
力扣例题

剑指 Offer 22. 链表中倒数第k个节点 - 力扣(LeetCode)

https://leetcode.cn/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/description/

顺序查找
/**
* Definition for singly-linked list.
* public class ListNode {
*     int val;
*     ListNode next;
*     ListNode(int x) { val = x; }
* }
*/
class Solution {
   public ListNode getKthFromEnd(ListNode head, int k) {
       ListNode pre=head,cur=head;
       int len=0;
       while(pre!=null)
       {
           len++;
           pre=pre.next;
       }
       int cnt=0;
       while(len-k!=cnt)
       {
           cnt++;
           cur=cur.next;
       }
       return cur;
   }
}
快慢指针
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode getKthFromEnd(ListNode head, int k) {
          ListNode fast=head;
          ListNode slow=head;
          while(k>0&&fast!=null)
          {
              fast=fast.next;
              k--;
          }
          while(fast!=null)
          {
              slow=slow.next;
              fast=fast.next;
          }
          return slow;
    }
}

两两交换链表中的节点 - 力扣(LeetCode) (leetcode-cn.com)

https://leetcode.cn/problems/swap-nodes-in-pairs/description/

创建虚拟头节点,疯狂迭代
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode swapPairs(ListNode head) {
        ListNode dummyhead=new ListNode(0);
        dummyhead.next=head;
        ListNode temp=dummyhead;
        while(temp.next!=null&&temp.next.next!=null)
        {
            ListNode node1=temp.next;
            ListNode node2=temp.next.next;
            node1.next=node2.next;
            node2.next=node1;
            temp.next=node2;
            temp=node1;
        }
        return dummyhead.next;
    }
}
递归(♂♂♂)
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode swapPairs(ListNode head) {
          if(head==null||head.next==null)return head;
          ListNode pre=head.next;
          head.next=swapPairs(pre.next);
          pre.next=head;
          return pre;
    }
}

反转链表 II - 力扣(LeetCode)

合并两个有序链表 - 力扣(LeetCode)

class Solution {
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
          if(list1==null)return list2;
          if(list2==null)return list1;
          if(list1.val>list2.val)
          {
              list2.next=mergeTwoLists(list2.next,list1);
              return list2;
          }
          else
          {
              list1.next=mergeTwoLists(list1.next,list2);
              return list1;
          }
    }
}

反转链表 - 力扣(LeetCode)

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
          ListNode pre=null;
          ListNode node=head;
          while (node!=null)
          {
              ListNode next=node.next;
              node.next=pre;
              pre=node;
              node=next;
          }
          return pre;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

链表-真正的动态数据结构 的相关文章

  • 导入java spring项目后如何构建maven

    你好 我是 java spring 概念的新手 所以我下载了一个示例spring应用程序并将其导入到eclipse中 我已经阅读了spring教程 要么我必须将maven安装到eclipse中才能运行spring项目 所以我已经安装了mav
  • 如何使用 Windows 上运行的 Java 服务检测用户活动?

    我的目标是使用 Java 创建一个系统监控应用程序 我想知道用户何时在 Windows PC 上进行活动 结果会是这样的 8 00 8 15 活动 9 12 10 29 活动 12 24 15 34 活动 我对任何其他信息 按下了哪个键 使
  • Java无法读取字体

    好的 我在使用自定义字体时遇到问题 基本上我得到了从互联网上下载的自定义字体并在我的程序中使用它 当我在 Eclipse 我使用的编辑器 中运行该程序时 一切正常 没有问题 但是 每当我将它从 eclipse 导出到 jar 时 或者尝试从
  • Java如何重写抽象类中的可选方法?

    假设我们有一个基类 public abstract class BaseFragment extends Fragment protected abstract boolean postExec 然后从它派生出其他类 例如 Fragment
  • Hibernate统计打印HQL:null

    我是使用休眠的新手 我打开了统计信息 与普通的 HQL 查询一起 我得到了许多这样的统计信息 INFO Statistics HQL null time 1724ms rows blah 有人可以以任何方式帮助我为什么null查询大约需要
  • 使用 org.eclipse.xsd 和 Maven2 分析 XML 模式

    我正在尝试实现示例代码本文 http help eclipse org help32 index jsp topic org eclipse xsd doc references articles dwtip1 scpw index htm
  • Java(正则表达式)-获取句子中的所有单词

    我需要将 java 字符串拆分为单词数组 假设该字符串是 Hi I need to split this string into a serie s of words 目前我正在尝试使用这个String strs str split w 但
  • Apache HttpClient 4.x 在上传较大文件时表现奇怪?

    我正在使用 java 和 scala 开发和测试一个简单的客户端 服务器应用程序 The server是基于com sun net httpserver HttpServer并允许使用 POST 和 PUT 操作通过基本的 RESTful
  • 获取 Spring Boot 中当前活动数据源的引用

    我想通过实现数据库数据初始化DataSourceInitializer 我将这些方法放在我的 Spring Boot 主方法下面 但似乎它根本没有被执行 我尝试故意删除字符只是为了触发一个错误来确认执行 什么也没有发生 Configurat
  • Selenium 和 xpath:查找带有类/id 的 div 并验证其中的文本

    我正在努力拥有xpath find a div并验证div有一个特定的string里面的文字 这是HTML div class Caption Model saved div and div class gwt HTML sfnStanda
  • Java 多态性中的字段如何工作? [复制]

    这个问题在这里已经有答案了 我正在读书面试问题 http javabypatel blogspot in 2016 04 java interview questions html关于java 发现了很好的例子 但感到困惑 因为没有很好 更
  • 如何在Java中验证字符串是否是有效的URL(包括深层链接)[重复]

    这个问题在这里已经有答案了 如何在 Java 中验证字符串是否是有效的 URL 包括深层链接 对于以下测试用例 该方法应返回 true http www example com gizmos https www example com gi
  • 将 Tango 3D 点投影到屏幕 Google Project Tango

    Project Tango 提供了点云 如何获取点云中 3D 点的像素位置 以米为单位 我尝试使用投影矩阵 但得到的值非常小 0 5 1 3 等 而不是 1234 324 以像素为单位 我包含我尝试过的代码 Get the current
  • 方法中缺少 return 语句错误

    我正在尝试编写一个返回计算机 MAC 地址字符串的静态方法 该函数本身可以在此处找到 http www mkyong com java how to get mac address in java http www mkyong com j
  • 在 libgdx 中截取屏幕截图

    我有一个应用程序 我想在其中截取游戏屏幕的屏幕截图并将其保存为图像并上传到 Facebook 我正在使用 Libgdx 我的重点是 android 谁能帮助我如何以编程方式截取游戏屏幕并将其另存为图像 现在相当容易 Libgdx提供了一个例
  • 在java中访问dll方法

    我正在尝试访问java中用c 编写的dll方法 从下面的代码我试图构建已成功生成的 dll using System using Microsoft Win32 namespace CyberoamWinHelper public clas
  • JdbcTemplate queryForInt/Long 在 Spring 3.2.2 中已弃用。应该用什么来代替呢?

    JdbcTemplate 中的 queryforInt queryforLong 方法在 Spring 3 2 中已弃用 我无法找出为什么或什么被认为是使用这些方法替换现有代码的最佳实践 典型方法 int rowCount jscoreJd
  • Java中有没有办法随机获取HashMap的值?

    Java中有没有办法随机获取HashMap的值 这有效 Random generator new Random Object values myHashMap values toArray Object randomValue values
  • GridLayout 中的 JLabel

    如何添加JLabel出于GridLayout 我有一个 8x8 网格布局 Container content getContentPane content setLayout new GridLayout 8 8 2 2 for int f
  • Tomcat 中 JNDI 的 Java Mail API 配置文档

    我花了几天时间弄清楚如何通过 JNDI 在 Tomcat 中配置 javax mail Session有认证 现在我明白了 但只是在深入研究代码之后 这次我看到了有史以来最糟糕的代码 javax mail Service connect S

随机推荐

  • 网络安全管理

    网络安全面临的主要威胁 人为因素 系统和运行环境等 常见的互联网服务安全包括 Web浏览器安全 文件传输 FTP 服务安全 E mail服务安全 远程登录 Telnet 安全 DNS域名安全和设备的实体安全 防火墙的局限性以及风险 防火墙能
  • 编译和安装gdb源码详细步骤介绍

    1 gdb源码下载 1 源码下载网址 https ftp gnu org gnu gdb 2 本文下面的编译是按照8 2版本的源码进行的 其余版本的源码可能会报错 需要自行解决 2 编译源码 2 1 Makefile文件 顶层目录 TOOL
  • 银行业法律法规与综合能力 第四章 银行从业法律基础 25%

    第四章 银行从业法律基础 4 1 银行基本法律法规 1 考点1 中国人民银行的职能和职责 一 职能 二 职责 考点2 中国人民银行的监督管理 一 直接检查监督杈 二 建议检查监督杈 三 特定情况下的检查监督权 考点3 国务院银行业监督管理机
  • hexo引用本地图片无法显示

    最近重新开始用起hexo 但是发现在文章中引用本地图片时总是显示不出来 问题如下图所示 花费了许久时间才解决这个问题 因此将一些解决经验整理出来 希望能帮助到大家 一 插件安装与配置 首先我们需要安装一个图片路径转换的插件 这个插件名字是h
  • 2023年智慧农业与经济发展国际研讨会议(ISSAED 2023)

    2023 International Seminar on Smart Agriculture and Economic Development 地点 合肥 智慧农业 农业信息管理系统 农业物联网系统集成与实践技术 农业大数据分析与应用 农
  • LLVM学习入门(2):实现解析器 Parser 和语法树 AST

    实现解析器 Parser 和语法树 AST 2 1 The Abstract Syntax Tree AST 语法抽象树 2 2 Parser Basics 基本的解析器 2 3 Basic Expression Parsing 基本表达式
  • 计算机与不确定性原理,不确定性原理

    题目 A simple baseline for bayesian uncertainty in deep learning 摘要 本文提出了一种简单 可扩展 通用的面向深度学习的不确定性表示和标定方法SWA Gaussian SWAG 随
  • SCILAB-自由科学计算软件

    SCILAB 自由科学计算软件 原创 2006 04 03 15 05 15 发表者 phoenixlin SCILAB是由法国国家信息与自动化研究院 INRIA 的科学家们开发的 开放源码 科学计算自由软件 SCILAB一词来源于英文 S
  • Graphics2D绘制图片,线段、矩形、圆形

    新建图片 BufferedImage newImage new BufferedImage 1079 512 BufferedImage TYPE INT RGB 获取绘图对象 Graphics2D g2d newImage createG
  • 访问云服务器文件共享,访问云服务器文件共享

    访问云服务器文件共享 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 安装传输工具在本地主机和Windows云服务器上分别
  • 数组工具类

    该工具类有两个方法 1 isContained方法用来判断一个数组中是否包含另一个数组中所有的数据 2 arrayDiff方法用来删除一个数组中与另一个数组中值相同的元素 arrUtil js文件 key存在时表示是对象数据 可以不存在时表
  • Flying to the Mars(字典树)

    Flying to the Mars Time Limit 5000 1000 MS Java Others Memory Limit 32768 32768 K Java Others Total Submission s 12965 A
  • 整形在内存中的存储

    目录 整形在内存中的存储 大小端字节序存储 什么是大端小端 判断大小端的代码 变量的创建是要在内存中开辟空间的 空间的大小是根据不同的类型而决定的 那接下来我们谈谈数据在所开辟内存中到底是如何存储的 整形在内存中的存储 计算机中的整数有三种
  • UE4 伤害事件,不同部位不同伤害(C++)

    UE4 伤害事件 不同部位不同伤害 C 可以先看射线检测 效果 打头和身体有不同的伤害 前面设置部分 先设置项目设置里的物理的Physical Surface 添加好身体的部位 2 添加了几个就几个变量 设置好它们的表面类型 3 找到被伤害
  • 第1章 数据库系统概论---数据库原理及应用

    目录 课程学习目标 本课程教学内容 课程教材 课程实践使用的数据库软件 第1章 数据库系统概论 1 数据库系统概述 一 基本概念 数据 文字 图片等数据化后存入计算机 数据库 DB 按一定的数据模型组织的共享数据 数据库管理系统 DBMS
  • python 读写hive

    最近正在 做一个 项目 需要把 算法模型的结果持久化 至hive 目前 使用的 pyhive 切记 在windows上不能使用 我目前在centos6 5上使用 官方说再macos和linux上可用 from pyhive import h
  • Vue中filter函数 过滤器的使用

    filters是什么 filters顾名思义是一个过滤器 就是对数据进行过滤筛选 将数据转化为我们想要的格式 但是他不会改变原始数据 filters分为两类 一 局部过滤器 局部过滤器的特点 只能作用于本组件没内 定义局部过滤器 在本组件内
  • Flutter和Android中的View

    在Android中 View是屏幕上显示的所有内容的基础 按钮 工具栏 输入框等一切都是View 在Flutter中 View相当于是Widget 然而 与View相比 Widget有一些不同之处 首先 Widget仅支持一帧 并且在每一帧
  • python3「非阻塞socket」报错 “BlockingIOError: [Errno 11]“ 复现以及分析解决

    梦想还在 生活当继续 一 前言 linux 下 用 python 的非阻塞 socket 通信时 遇到了 BlockingIOError Errno 11 Resource temporarily unavailable 错误 翻译报错信息
  • 链表-真正的动态数据结构

    创建节点 public class Node T val Node next public Node T val Node next this val val this next next public Node this null nul