当前位置: 首页 > article >正文

03、数据结构与算法--单向链表

一种比顺序表稍微复杂些的结构...一、认识链表1、基本结构链表是一个个结点构成的就像火车顺序表可以通过get方法(传入下标)来获取表因为它们的地址是连续的与顺序表不同的是链表的物理存储不连续要获取某个结点的话不得不进行遍历2、手动实现注意 1、先绑定后面结点2、遍历时注意是cur ! null还是cur.next ! nullpackage structure; public class MyLinkedList { public Node head; //结点类 class Node { public int val; public Node next; public Node(int val) { this.val val; } } // 傻瓜式创建展示一下链表结构 // public void createList () { // // Node node1 new Node(12); // Node node2 new Node(24); // Node node3 new Node(36); // Node node4 new Node(48); // Node node5 new Node(50); // // node1.next node2; // node2.next node3; // node3.next node4; // node4.next node5; // // this.head node1; // // } //打印链表val值 public void show () { Node cur head; while (cur ! null) { System.out.print(cur.val ); cur cur.next; } System.out.println(); } //从传入的head开始遍历 public void show (Node newhead) { Node cur newhead; while (cur ! null) { System.out.print(cur.val ); cur cur.next; } System.out.println(); } //头插法 public void addFirst(int data) { Node n new Node(data); n.next head; head n; } //尾插法 public void addLast(int data) { Node n new Node(data); if (head null){ head n; //此处没有return会继续执行下面的内容 return; } Node cur head; while (cur.next ! null){ cur cur.next; } cur.next n; } //将数据插入到下标index位置 public void addIndex(int index, int data) { //这样就不用重复调用方法了 int len size(); if(index 0 || index len){ System.out.println(index位置不合法); return; } //插在最前 if (index 0){ addFirst(data); return; } //插到最后 if (index len){ addLast(data); return; } //代表index位置的前一位 Node curN head; // 此写法可读性较差 // int count index; // while (count - 1 ! 0){ // cur cur.next; // count--; // } //找到index的前一位curN for (int i 0;i index-1;i){ curN curN.next; } Node n new Node(data); //主要逻辑 n.next curN.next; curN.next n; } //查找key值是否在单链表当中 public boolean contains(int key) { Node cur head; while (cur ! null){ if (cur.val key){ return true; } cur cur.next; } return false; } // //删除遇见的第一个值为key的节点 // public void remove(int key) { // // Node cur head; // Node del findDel(key); // // //确保头结点不为空 // if(head null){ // return; // } // //删除头结点 // if(head del){ // head head.next; // return; // } // // //优先选择引用比较比值比较更安全 // while (cur ! del){ // cur cur.next; // } // // //主要逻辑 // cur.next del.next; // // } // // //找到要删除结点del的地址 // public Node findDel(int key){ // // Node i head; // // while (i ! null){ // if (i.val key){ // return i; // } // i i.next; // } // return null; // // } //删除遇见的第一个值为key的节点 public void remove(int key) { //确保头结点不为空 if(head null){ return; } //删除头结点 if(head.val key){ head head.next; return; } Node prev head; Node del prev.next; //优先选择引用比较比值比较更安全 while (prev.next ! null){ if (del.val key){ //主要逻辑 prev.next del.next; return; } prev prev.next; } } //删除所有值为key的节点 public void removeAllKey(int key) { // //先循环处理头结点可能连续多个 // while (head ! null head.val key){ // head head.next; // } // //链表为空直接返回 if (head null){ return; } Node prev head; Node del prev.next; //主要逻辑 while (del ! null){ if(del.val key){ del del.next; prev.next del; }else { del del.next; prev prev.next; } } //最后再处理头结点写法更为简洁 if (head.val key){ head head.next; } } //得到单链表结点的数量 public int size() { int count 0; Node cur head; while (cur ! null){ count; cur cur.next; } return count; } //反转链表 //从传入的newHead头结点开始反转链表 public Node reverseList(Node newHead) { if(newHead null){ return newHead; } //确定cur位置将传入的头结点next置空 Node cur newHead.next; newHead.next null; Node curN; while(cur ! null){ //保存cur下一个结点的值然后再修改指向 curN cur.next; cur.next newHead; //newHead接着往下走cur来到curN位置 newHead cur; cur curN; } return newHead; } //找到链表的中间结点 public Node middleNode(Node head) { Node fast head; Node slow head; while(fast ! null fast.next ! null){ fast fast.next.next; slow slow.next; } return slow; } //返回倒数第k个结点的值 public int kthToLast(Node head, int k) { Node fast head; Node slow head; int count 0; while(count ! k-1){ fast fast.next; count; } while(fast.next ! null){ fast fast.next; slow slow.next; } return slow.val; } //清空 public void clear() { head null; } public static void main (String[]args){ MyLinkedList x new MyLinkedList(); //x.createList(); x.addFirst(67); x.addFirst(24); x.addFirst(8888); x.addFirst(48); x.addFirst(24); x.show(); int a x.kthToLast(x.head,3); System.out.println(a); } }3、重要方法的逻辑图①头插法②尾插法③指定位置插入中间元素这里要找到index的前一位curN来完成后续绑定④删除遇见的第一个值为key的结点遇见key删除后直接返回没遇见仅prev继续往下走⑤删除所有值为key的结点也是面试题目遇见要删除的key值执行删除逻辑没遇见要删除的key值key跟prev都继续往下走del一直走过最后一个结点停止这里的prev一直充当del的前置结点直到中间结点处理完以后再处理头结点二、链表的面试题1、反转链表2、分割链表Ⅰ代码解析①//反转链表 //从传入的newHead头结点开始反转链表 public Node reverseList(Node newHead) { if(newHead null){ return newHead; } //确定cur位置将传入的头结点next置空 Node cur newHead.next; newHead.next null; Node curN; while(cur ! null){ //保存cur下一个结点的值然后再修改指向 curN cur.next; cur.next newHead; //newHead接着往下走cur来到curN位置 newHead cur; cur curN; } return newHead; }如果想接收返回的头结点完全可以定义一个show的重载方法//从传入的head开始遍历 public void show (Node newhead) { Node cur newhead; while (cur ! null) { System.out.print(cur.val ); cur cur.next; } System.out.println(); }最后调用即可public static void main (String[]args){ MyLinkedList x new MyLinkedList(); x.addFirst(67); x.addFirst(24); x.addFirst(48); x.addFirst(24); x.show(); System.out.println(); Node a x.reverseList(x.head); x.show(a); }②public Node partition(Node head, int x) { // 1、初始化变量 Node bs null; Node be null; Node as null; Node ae null; // 2、定义 cur 并初始化 Node cur head; // 3、遍历链表 while(cur ! null) { if(cur.val x) { // 处理小于 x 的节点 if(bs null) { bs cur; be cur; } else { be.next cur; be be.next; } } else { // 处理大于等于 x 的节点 if(as null) { as cur; ae cur; } else { ae.next cur; ae ae.next; } } // 4、移动指针 cur cur.next; } // 5、连接两条链 if(bs null) { return as; } be.next as; //6、找到最后结点置空 if(ae ! null){ ae.next null; } return bs; }测试用例:public static void main (String[]args){ LinkPlus x new LinkPlus(); //x.createList(); x.addFirst(67); x.addFirst(24); x.addFirst(8888); x.addFirst(48); x.addFirst(24); x.show(); //没有小于的就返回原链表 x.show(x.partition(x.head,24)); }Ⅱ逻辑图解①⬇️⬇️②这两道相对简单些3、链表的中间结点4、返回倒数第k个结点Ⅰ代码解析③//找到链表的中间结点 public Node middleNode(Node head) { Node fast head; Node slow head; //奇偶兼容 while(fast ! null fast.next ! null){ fast fast.next.next; slow slow.next; } return slow; }想要从slow为头向后打印与上面题目同理public static void main (String[]args){ MyLinkedList x new MyLinkedList(); //x.createList(); x.addFirst(67); x.addFirst(24); x.addFirst(8888); x.addFirst(48); x.addFirst(24); x.show(); Node cur x.middleNode(x.head); x.show(cur); }④//返回倒数第k个结点的值 public int kthToLast(Node head, int k) { Node fast head; Node slow head; int count 0; // if(k 0){ return -1; } while(count ! k-1){ fast fast.next; //写在这里就不用在前面写k size少一次遍历 if(fast null){ return -1; } count; } while(fast.next ! null){ fast fast.next; slow slow.next; } return slow.val; }测试用例public static void main (String[]args){ MyLinkedList x new MyLinkedList(); //x.createList(); x.addFirst(67); x.addFirst(24); x.addFirst(8888); x.addFirst(48); x.addFirst(24); x.show(); int a x.kthToLast(x.head,3); System.out.println(a); }Ⅱ逻辑图解③④本章完

相关文章:

03、数据结构与算法--单向链表

一种比顺序表稍微复杂些的结构... 一、认识链表 1、基本结构 链表是一个个结点构成的,就像火车 顺序表可以通过get方法(传入下标)来获取表,因为它们的地址是连续的 与顺序表不同的是,链表的物理存储不连续,要获取某个结点的话不…...

Blender 5.0三维建模软件免费下载

分享文件:Blender 下载链接:https://pan.xunlei.com/s/VOnoa-uAZeIscnA0CetsTTVXA1?pwdq9az# 下载连接...

Adobe Bridge(Br)2026下载连接

下载链接:https://pan.xunlei.com/s/VOnoa7p2tYOZ1jAQ_1Qvn1T7A1?pwdmb33 下载连接...

C++编程主题:智能指针深入解析

C编程主题:智能指针深入解析 在C的广阔领域中,内存管理一直是一个既基础又至关重要的环节。传统的手动内存管理方式,如使用new和delete,虽然灵活,但容易引发内存泄漏、悬垂指针等问题,给程序的安全性和稳定…...

Python程序设计强基计划10讲 · 第三讲:字典与集合——哈希表的威力

Python程序设计强基计划10讲 第三讲:字典与集合——哈希表的威力作者:培风图南以星河揽胜 发布时间:2026年3月31日 适用对象:已掌握列表、元组等序列类型的Python初学者 前置知识:第二讲《列表与元组——序列操作的艺…...

Stratovirt安装及使用

文章目录安装创建虚拟机安装 硬件要求 处理器架构:仅支持AArch64和x86_64处理器架构。AArch64需要ARMv8及更高版本且支持虚拟化扩展;x86_64支持VT-x。 软件要求 操作系统:openEuler 20.09及更高版本 我当前安装的stratovirt版本是2.1.0&…...

9.3LED点阵屏显示动画

#include <REGX52.H> #include "Delay.h" #include "MatrixLED.h"//动画数据 unsigned char code Animation[]{0x3C,0x42,0xA9,0x85,0x85,0xA9,0x42,0x3C,0x3C,0x42,0xA1,0x85,0x85,0xA1,0x42,0x3C,0x3C,0x42,0xA5,0x89,0x89,0xA5,0x42,0x3C, };void…...

大模型Agent-应用小记【转载】

参考资料 万字长文解读LLM Agent&#xff1a;总体框架、经典论文与实践万字长文解析Agent框架中的上下文管理策略从Claude Code入手看Agent框架设计思路&#xff08;基础篇&#xff09; Agent基础 Agent基本定义 LLM 工具调用 / 长期记忆能力 / 规划能力 上下文管理 是什…...

【豆包从入门到精通】001、初识豆包:大模型时代的入门钥匙

001、初识豆包&#xff1a;大模型时代的入门钥匙 昨天深夜调试一个嵌入式日志解析脚本时&#xff0c;我又遇到了那个老问题——正则表达式写到第三层嵌套就开始失控&#xff0c;同事的代码注释像密码本&#xff0c;而产品经理在群里催着要三个月前的异常模式统计。就在我对着满…...

Java static关键字全解析:从共享属性到工具类,一篇搞懂静态变量和静态方法

你有没有想过这些问题&#xff1a;为什么main方法是static的&#xff1f;为什么工具类的方法都是static的&#xff1f;为什么静态方法里不能直接调用非静态方法&#xff1f;今天这篇文章&#xff0c;我们就把static关键字彻底讲透。从共享属性到工具类&#xff0c;从内存原理到…...

【数据结构】顺序表的应用->通讯录(详细代码及配图)

小编主页详情<-请点击 小编gitee代码仓库<-请点击 本文主要介绍了数据结构的顺序表的应用->通讯录&#xff0c;内容全由作者原创&#xff08;无AI&#xff09;&#xff0c;同时深度解析了通讯录顺序表增删查改等功能&#xff0c;并带有配图帮助博友们更好的理解&#…...

008、系统组装与API服务化:构建完整RAG Pipeline

昨天深夜调试时遇到一个典型问题:用户问“今年Q3财报关键数据”,系统返回的却是三年前的老数据。检查发现,检索模块返回了相关文档,但排序逻辑把发布时间字段误当成相关性分数处理了。这种模块间接口不对齐的问题,在组装RAG系统时太常见了。 管道组装:不只是拼积木 很多…...

007、大语言模型集成:Prompt工程与上下文管理

昨天深夜调试时遇到一个诡异问题:同样的查询,在本地测试时LLM能准确返回产品参数,上了生产环境就总答非所问。盯着监控日志看了半小时才发现,某个微服务在拼接用户历史对话时,漏掉了两条关键消息——上下文窗口看似饱满,实则缺了核心信息。这个坑让我重新审视了RAG系统中…...

华为:渐进解锁细粒度视觉感知

&#x1f4d6;标题&#xff1a;FineViT: Progressively Unlocking Fine-Grained Perception with Dense Recaptions &#x1f310;来源&#xff1a;arXiv, 2603.17326v1 &#x1f31f;摘要 虽然多模态大语言模型&#xff08;MLLM&#xff09;经历了快速的发展&#xff0c;但其视…...

我郑重声明:我的目标是图灵奖,这是理工男的执念!所以在第一时间发现可实现AGI蓝图的时候,就给图灵奖官方邮箱发了论文PDF,这是存档+时间戳。我知道,明确知道,最终的AGI实现必然走我的路子。哈哈哈

总有人拿民科来说事&#xff0c;仔细想咱真也是民科&#xff0c;&#xff0c;&#xff0c;没啥说的&#xff0c;没混上教授的&#xff0c;那个不是民科&#xff1f;&#xff1f;&#xff1f; 不要拿民科怎么样来说事&#xff0c;我开始没说自己咋样&#xff0c;真就只想那个图…...

私域流量运营自动化 1.5 小时上手

OpenClaw 电商实战 第 2 篇 字数&#xff1a;约 10000 字 阅读时间&#xff1a;约 25 分钟 难度&#xff1a;⭐ 入门&#xff08;无需编程&#xff09; 更新时间&#xff1a;2026-04-01 写在前面 这个教程能帮你解决什么&#xff1f; 如果你是&#xff1a; ✅ 电商运营人员✅…...

LangChain与向量库集成:Document Loaders与Text Splitters

上周三凌晨两点&#xff0c;我被一个奇怪的召回问题卡住了&#xff1a;明明在PDF里写得很清楚的配置项&#xff0c;用相似问题去查向量库&#xff0c;总是返回一些边缘内容。打开调试日志一看&#xff0c;发现切出来的文本片段里&#xff0c;前半段是某个章节的结尾&#xff0c…...

CW32L012/F030灵眸X1智能小车--电机调速控制

1.认识PWM PWM&#xff08;Pulse Width Modulation脉宽调制&#xff09;是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用&#xff0c;方波占空比被调制用来对一个具体模拟信号的电平…...

三菱PLC与MCGS组态农田智能灌溉系统:后发送产品梯形图原理图及IO分配与组态画面解析

基于三菱PLC和MCGS组态农田智能灌溉系统 我们主要的后发送的产品有&#xff0c;带解释的梯形图接线图原理图图纸&#xff0c;io分配&#xff0c;组态画面上周刚把农田智能灌溉的项目收尾&#xff0c;把资料打包发给客户的时候&#xff0c;终于能瘫在椅子上喝杯冰可乐了。这个…...

【C++第二十三章】C++11

前言 &#x1f680;C11 常被称为现代 C 的起点。它不是一次零碎的小修小补&#xff0c;而是一次真正改变编程方式的大版本更新&#xff1a;从统一初始化&#xff0c;到 auto / decltype 的类型推导&#xff1b;从右值引用、移动语义&#xff0c;到完美转发&#xff1b;再到 lam…...

Redis 全量主从同步和增量主从同步详解

Redis 主从同步:全量同步与增量同步详解 Redis 主从复制是实现高可用、读写分离和数据冗余的基础。复制过程分为全量同步和增量同步两种模式。理解它们的工作原理、触发条件及配置优化,是系统分析师设计高可用 Redis 架构的关键。 📌 一、主从复制基本概念 主节点(Master…...

从熬夜改稿到一键成稿:Paperxie AI 毕业论文写作,本科生的学术通关神器

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AIPPThttps://www.paperxie.cn/ai/dissertationhttps://www.paperxie.cn/ai/dissertation 一、写论文的痛&#xff0c;每个本科生都懂 凌晨三点的宿舍&#xff0c;电脑屏幕亮着刺眼的光&#xff0c;Word 文…...

2026年全场景适配最值得关注的五大能源管理系统

各位读者&#xff0c;大家好&#xff01;在全球能源结构加速转型的当下&#xff0c;能源管理系统的发展至关重要。今天我要为大家介绍2026年全场景适配最值得关注的五大能源管理系统。这些系统对于企业提升能源管理的精细化、智能化水平&#xff0c;增强核心竞争力有着重要意义…...

MongoDB单节点转副本集(Docker安装版本)

为什么需要副本集&#xff1f;场景单节点副本集支持 Oplog❌✅MongoShake 同步❌✅数据备份恢复仅全量全量增量高可用❌✅核心结论&#xff1a;MongoShake 依赖 Oplog 实现实时同步&#xff0c;而 Oplog 只在副本集模式下产生。Docker Compose 配置version: 3.8 services:mongo…...

特定域名的proxy访问

不想破坏现有的proxy规则&#xff1b;某些域名需要proxy才可以上。 使用gost中的ss&#xff0c;简单搭建proxy&#xff1a;gost文档&#xff1a;https://v2.gost.run/ss/1. gost配置 服务端&#xff1a; gost -Lss://aes-128-gcm:password:8361客户端&#xff08;windows&#…...

2026届毕业生推荐的五大AI论文网站实际效果

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 倚仗自然语言处理跟学术知识图谱技术的AI开题报告工具&#xff0c;能够快速生成研究背景、文…...

2025最权威的降重复率网站解析与推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 关于DeepSeek模型的学术论文&#xff0c;要着重于它的核心技术架构&#xff0c;这其中涵盖混…...

4 大类别 22 个高效的 Agentic Skills | 适用于 Claude、GPT

增强各类 AI 模型的能力&#xff0c;帮助你在写作、内容生产、研究分析、视觉表达、自动化执行等方面提升效率。 这些技能以 .md 格式编写&#xff0c;虽然这是 Claude 常用的技能格式&#xff0c;但你同样可以将内容复制到 ChatGPT 中使用。 Claude 如何创建 skill 国内用户…...

一篇吃透RNN(循环神经网络),LSTM(长短期记忆网络),BiLSTM(双向长短期记忆网络)算法,计算机小白也能轻松看懂

NLP-AHU-125&#xff08;神秘暗号&#xff09;哈喽各位CSDN的小伙伴们&#xff0c;我是一名专注AI入门干货的大学生博主&#xff5e; 相信刚接触深度学习序列模型的同学&#xff0c;都被RNN、LSTM、BiLSTM这三个“孪生兄弟”绕晕过&#xff1a;明明都是处理序列数据&#xff0c…...

Golutra:超越 IDE , 一个人,一个 AI 军团!使用赛博监工系统,指挥你的 AI 牛马

⚡ 你有没有想过&#xff0c;如何能像管理微信群一样管理你的 AI 团队&#xff0c;让多 Agent 协同工作不再是幻想&#xff01; | 以下观点都是个人使用&#xff0c;以及测评观点。 AI 工具革命的下一个阶段 如何能通过多路协同的方式调用不同的 AI 工具&#xff0c;然后又让…...