【数据结构与算法】链表的实现以及一些基本算法

目录

单选链表的基本实现

有序列表的合并(双指针法)

链表的反转 

链表实现两数之和 

判定链表是否有环


单选链表的基本实现

public class LinkedList1 {//头节点Node first;//尾节点Node last;//大小int size = 0;//头插法public void addFirst(int v) {Node newNode = new Node(v);Node f = first;first = newNode;if (f == null) {last = newNode;} else {newNode.next = f;}size++;}//尾插法public void addLast(int v) {Node newNode = new Node(v);Node l = last;last = newNode;if (l == null) {first = newNode;} else {l.next = newNode;}size++;}//使用节点尾插public void addNode(Node node){if (last ==null){last=node;first=node;}else {Node l =last;l.next=node;last=node;}}//链表的遍历@Overridepublic String toString() {StringJoiner sj = new StringJoiner("->");for (Node n = first; n != null; n = n.next) {sj.add(String.valueOf(n.val));}return sj.toString();}public static class Node {int val;Node next;Node(int val) {this.val = val;}}
}

有序列表的合并(双指针法)

//链表的有序合并排序public static LinkedList1 merge(LinkedList1 list1, LinkedList1 list2) {Node n1 = list1.first, n2 = list2.first;LinkedList1 result = new LinkedList1();while (n1 != null || n2 != null) {if (n1 == null) {result.addLast(n2.val);n2 = n2.next;continue;}if (n2 == null) {result.addLast(n1.val);n1 = n1.next;continue;}if (n1.val < n2.val) {result.addLast(n1.val);n1 = n1.next;} else {result.addLast(n2.val);n2 = n2.next;}}return result;}

 测试

LinkedList1 linkedList1 =new LinkedList1();linkedList1.addLast(1);linkedList1.addLast(4);linkedList1.addLast(6);LinkedList1 linkedList2 =new LinkedList1();linkedList2.addLast(2);linkedList2.addLast(3);linkedList2.addLast(5);linkedList2.addLast(9);System.out.println("链表1:"+linkedList1);System.out.println("链表2:"+linkedList2);//有序链表的合并排序System.out.println("链表1与链表2合并:"+LinkedList1.merge(linkedList1, linkedList2));

链表的反转 

//链表的反转public static LinkedList1 reverseLinked(LinkedList1 list1) {Stack<Node> stack = new Stack<>();for (Node n = list1.first; n != null; n = n.next) {stack.add(n);}LinkedList1 result = new LinkedList1();while (!stack.isEmpty()) {result.addLast(stack.pop().val);}return result;}

测试

        LinkedList1 linkedList1 =new LinkedList1();linkedList1.addLast(1);linkedList1.addLast(4);linkedList1.addLast(6);System.out.println("链表1:"+linkedList1);//链表的反转System.out.println("链表1反转后:"+LinkedList1.reverseLinked(linkedList1));

测试结果

链表实现两数之和 

    //两数之和public static LinkedList1 addNumber(LinkedList1 list1, LinkedList1 list2) {Node n1 = list1.first, n2 = list2.first;LinkedList1 result = new LinkedList1();int carry = 0;while (n1 != null || n2 != null) {int x = n1 != null ? n1.val : 0;int y = n2 != null ? n2.val : 0;int sum = x + y + carry;carry = sum / 10;result.addLast(sum % 10);if (n1 != null) {n1 = n1.next;}if (n2 != null) {n2 = n2.next;}}if (carry != 0) {result.addLast(carry);}return result;}

测试

        LinkedList1 linkedList1 =new LinkedList1();linkedList1.addLast(1);linkedList1.addLast(4);linkedList1.addLast(6);LinkedList1 linkedList2 =new LinkedList1();linkedList2.addLast(2);linkedList2.addLast(3);linkedList2.addLast(5);linkedList2.addLast(9);//两数之和System.out.println("链表1:"+linkedList1);System.out.println("链表2:"+linkedList2);System.out.println("链表1+链表2:"+LinkedList1.addNumber(linkedList1,linkedList2));

测试结果(注意从左到右依次是个十百位)

判定链表是否有环

方法一 通过set集合

    //set集合判断是否有环public static boolean hasCycle(Node node) {Set<Node> set = new HashSet<>();while (node != null) {if (set.contains(node)) {return true;}set.add(node);node = node.next;}return false;}

方法二 通过快慢指针

    //快慢指针判断是否有环public static boolean hasCycle2(Node node) {Node fast = node;//快指针Node slow = node;//慢指针//判断是不是空节点if (node == null) {return false;}while (fast != null && fast.next != null && slow != null) {fast = fast.next.next;slow = slow.next;if (fast == slow) {return true;}}return false;}

测试 无论方法一还是二 测试结果都是相同 一般使用方法二 效率更高 更节省资源

        LinkedList1.Node node1 =new LinkedList1.Node(1);LinkedList1.Node node2 =new LinkedList1.Node(2);LinkedList1.Node node3 =new LinkedList1.Node(3);LinkedList1.Node node4 =new LinkedList1.Node(4);LinkedList1.Node node5 =new LinkedList1.Node(5);node1.next=node2;node2.next=node3;node3.next=node4;node4.next=node5;node5.next=node3;//环 注意这是专门设置的环//set集合判断是否有环System.out.println("set集合判断是否有环:"+LinkedList1.hasCycle(node1));//快慢指针判断是否有环System.out.println("快慢指针判断是否有环:"+LinkedList1.hasCycle2(node1));

测试结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/142880.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

什么才是物联网领域最好的开发语言?

什么才是物联网领域最好的开发语言&#xff1f; 最好&#xff01;运行最快&#xff1f;开发最高效&#xff1f;最容易学习&#xff1f; 各有特点&#xff01; 采用C/C语言&#xff0c;运行最快&#xff0c;一般采用厂家提供的底层驱动支持包BSP&#xff0c;所有MCU都支持。如…

selenium自动化测试+OCR-获取图片页面小说

随着爬虫技术的发展&#xff0c;反爬虫技术也越来越高。 目前有些网站通过自定义字体库的方式实现反爬&#xff0c;主要表现在页面数据显示正常&#xff0c;但是页面获取到的实际数据是别的字符或者是一个编码。 这种反爬需要解析网站自己的字体库&#xff0c;对加密字符使用字…

Leetcode算法二叉树—117. 填充每个节点的下一个右侧节点指针 II(层序遍历/队列)

目录 117. 填充每个节点的下一个右侧节点指针 II - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a; 代码&#xff1a; 运行结果&#xff1a; ​编辑 给定一个二叉树&#xff1a; struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指…

2023-09-21 buildroot linux 查看应用的log打印信息,命令cat /var/log/messages

一、应用会调用syslog 把打印信息输出到串口&#xff0c;debug 串口会打印kernel的log和上层应用的的log。 二、linux 命令cat /var/log/messages查看应用log

【常用代码15】文字单词超出强制分割换行,word-break: break-all;和word-wrap: break-word;的区别

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 文件上传后显示文件名&#xff0c;名称过长&#xff0c;超出div 有些文件名如下图 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 一般图片上传&#xff0c;要展示文件名&#x…

基于Springboot实现毕业生信息招聘平台管理系统演示【项目源码+论文说明】分享

基于Springboot实现毕业生信息招聘平台管理系统演示 摘要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 毕业生信息招聘平台&#xff0c;主要的模块包括查看管理员&#xff1b;首页、个人中心、企…

预制菜行业数据分析(京东数据挖掘)

最近一段时间&#xff0c;关于预制菜进校园事件的讨论热度高涨。而这两天&#xff0c;核酸大王“张核子”转行开预制菜公司卖方便米饭的消息又被传出&#xff0c;直接让预制菜市场饱受关注。 “预制菜是近两年的风口”&#xff0c;这个结论鲸参谋早在以往的内容中专门讨论过&a…

自学WEB后端03-Node.js 语法

学习后端路线&#xff1a; JavaScript 基础语法 Node,js 内置 API 模块 (fs、 path、 http等) 第三方 API 模块 (express、mysql等) 今天主要回顾下Node.js 语法 Node.js 是基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;它提供了一种能够在服务器端运行 JavaScr…

前端求职指南

简历求职指南 为什么没有面试&#xff1f; 1、简历写的不好 2、简历投递不好 简历的定义是什么&#xff1f; 是求职者向未来雇主展示自己专业技能和职业素养的自我推销工具&#xff0c;以找到工作为目的。 什么时候改简历&#xff1f; 每半年或一年更新一次工作中的成长 再工…

Open3D 进阶(12)PCA拟合平面

目录 一、算法原理二、代码实现三、结果展示四、优秀博客本文由CSDN点云侠原创,原文链接。爬虫网站自重。 一、算法原理 本文实现基于主成分分析方法的最小二乘拟合平面。原理如下: 针对整个点云 P = { p i }

torch.sum()——dim参数

dim指在dim的这个维度上&#xff0c;对tesnor 进行求和&#xff0c;如果keepdim&#xff08;保持维度&#xff09;False&#xff0c;返回结果会删去dim所指的这个维度。以下面的例子分析dim的参数~ torch.tensor([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]) print(…

如何兼顾性能+实时性处理缓冲数据?

们经常会遇到这样的数据处理应用场景&#xff1a;我们利用一个组件实时收集外部交付给它的数据&#xff0c;并由它转发给一个外部处理程序进行处理。考虑到性能&#xff0c;它会将数据存储在本地缓冲区&#xff0c;等累积到指定的数量后打包发送&#xff1b;考虑到实时性&#…

Linux Ubuntu配置Git的方法

本文介绍在Linux操作系统的Ubuntu版本中&#xff0c;配置分布式开源版本控制系统Git&#xff0c;随后基于Git克隆GitHub中项目的代码的详细方法。 在之前的文章分布式版本控制系统Git的下载、安装与使用其复制GitHub项目代码的方法&#xff08;https://blog.csdn.net/zhebushib…

区块链实验室(27) - 区块链+物联网应用案例

分享最新的区块链物联网应用案例&#xff1a;HPCLS-BC

HTML详细基础(一)H5标签入门

本帖为B站网课黑马程序员的学习笔记&#xff0c;总结了H5最核心的概念性质&#xff0c;适用于初学者或者应对期末考试的群体~ 目录 一.Html简介 二.开发工具 三.基础标签 1.核心基础 2.标题标签 3.段落标签 ​编辑 4.文本格式标签 5.盒子标签 6.图片标签 一.Html简介 H…

索引的数据结构

文章目录 索引的数据结构1. 为什么使用索引2 索引及其优缺点2.1 索引概述2.2 索引优点 3. InnoDB中索引的推演 索引的数据结构 1. 为什么使用索引 索引是存储引擎用于快速找到数据记录的一种数据结构&#xff0c;如书的目录&#xff0c;通过目录找到对应文章的页码&#xff0…

ternsor合并与分割

拼接&#xff1a;拆分&#xff1a;Cat、StackSplit、Chunk 1、cat&#xff08;concat&#xff09; 统计班级学生成绩&#xff1a; [class1-4, students, scores] [class5-9, students, scores] 将这九名学生的成绩进行合并 a torch.rand(4, 32, 8) b torch.rand(5, 32, 8…

特种设备安全监测终端,降低安全隐患风险!

特种设备运行关系到人民生命财产安全&#xff0c;关系到经济健康发展&#xff0c;关系到社会的稳定。有关特种设备的事故基本都发生在使用过程中&#xff0c;因此&#xff0c;使用过程的安全管理是特种设备的管理重点。针对国内特种设备本身存在事故隐患及安装、维修、操作、指…

知识工程---neo4j 5.12.0+GDS2.4.6安装

&#xff08;已安装好neo4j community 5.12.0&#xff09; 一. GDS下载 jar包下载地址&#xff1a;https://neo4j.com/graph-data-science-software/ 下载得到一个zip压缩包&#xff0c;解压后得到jar包。 二. GDS安装及配置 将解压得到的jar包放入neo4j安装目录下的plugi…