【数据结构与算法】单向链表的超详细底层源码,手工实现

用C#手写100+算法与数据结构:从零实现到面试实战 算法与数据结构是编程能力的基石,也是技术面试中区分候选人的关键维度。理解其底层原理,能帮助开发者更高效地使用现成集合类,避免因依赖不确定行为而引发的隐蔽问题。掌握排序、查找、树、图等经典算法的实现要点,不仅有助于应对算法面试中的手写代码环节,还能在实际工程中做出更合理的技术选型。对于使用C#的开发者而言,手写一遍链表反转、红黑树调整、KMP的next数组,既能加深对语言特性如泛型、引用类型、值类型和内存分配的理解,也能提升排查复杂bug的能力。本文以作者用C#从零实现百余种算法和数据结构的实践为基础,分享代 阅读详情

目录

一、链表类简介:(王者英雄类)

1、HeroNode类属性:

2、HeroNodeLinkedList类方法:

二:代码实现:

1、  创建HerNode类

2、创建HeroNodeLinkedList类,实现两种添加方法

3、实现遍历操作

5、实现删除操作

6、实现链表的翻转

7、实现链表的逆序打印


一、链表类简介:(王者英雄类)

1、HeroNode类属性:

             作为演示,属性、方法权限设置为public

                        编号:id;

                        英雄名:name;

                        昵称:otherName;

                        下一个结点:next;

2、HeroNodeLinkedList类方法:

              增、删、改、查、翻转、倒序打印

二:代码实现:

1、  创建HerNode类

public class HeroNode{
public int id;//英雄编号
public String name;//英雄名称
public String otherName;//昵称
public HeroNode next;//结点指针

//创建一个有参构造
public HeroNode(int id,String name,String otherName){
this.id = id;
this.name = name;
this.otherName = otherName;
}

//重写一个toString方法
public String toString(){
return "id="+id+";name="+name+";otherName="+otherName;
}
}

2、创建HeroNodeLinkedList类,实现两种添加方法

class HeroNodeLinkedList{
//初始化头结点,头结点仅作为头,不存放数据
HeroNode head = new HeroNode (0,"","");

    //add方法  按添加顺序添加
    public void add(HeroNode hero){
//作为头结点,不能移动,需要创建一个临时结点,代替头结点移动
        HeroNode temp = head;
        while(true){
            if(temp.next==null){ //找到最后一个结点
                temp.next = hero;
                break;
            }
            temp = temp.next;//否则指针后移
        }
    }





  //addByNum 方法,按照id编号顺序来添加
    public void  addByNum(HeroNode hero){
        HeroNode temp = head;
//遍历
        while(true){
            if(temp.next == null){
                //hero.next=temp;
                temp.next = hero;
                break;
            }
            if(temp.next.no>hero.no ){
                hero.next = temp.next;
                temp.next = hero;
                break;
            }else if(temp.next.no==hero.no){
                System.out.println("英雄编号:"+hero.no+"的英雄已存在,无法重复添加");
                break;
            }
            temp = temp.next;
        }
    }
}

3、实现遍历操作

 public void list(){
//创建一个临时指针 temp
        HeroNode temp = head;
//判断链表是否为空
        if(head.next == null){
            System.out.println("链表为空!");
            return;
        }
        while(true){
            if(temp.next == null){
                break;
            }
            System.out.println(temp.next);
//指针后移
            temp=temp.next;
        }
    }

 4、实现修改操作

    public void set(HeroNode hero){
        HeroNode temp = head.next;
        //链表是否为空
        if(head.next == null){
            System.out.println("链表为空,无法修改!");
            return;
        }
        while(true){
            if(temp.next == null){
                System.out.println("当前英雄不在链表中,无法修改!");
                return;
            }
            if(temp.id == hero.id){
                //找到了
                temp.name = hero.name;
                temp.otherName = hero.otherName;
                System.out.println("修改成功!");
                break;
            }
            temp = temp.next;
        }
    }

5、实现删除操作

    public void remove(int id){
//创建临时结点
        HeroNode temp = head;
//判断链表是否为空
        if(head.next==null){
            System.out.println("链表为空,无法执行删除操作!");
            return;
        }

        while(true){
            if(temp.next==null){
                System.out.println("您要删除的编号为:"+id+"的英雄不在列表中,无法执行删除操作!");
                return;
            }
            if(temp.next.id == id){
                temp.next=temp.next.next;
                System.out.print("删除成功!");
                break;
            }
            temp=temp.next;
        }

    }

6、实现链表的翻转

public void reversetList(){
//判断链表是否只有一个元素或者为空链表
        if(head.next == null || head.next.next == null){
            return;
        }
//创建一个临时指针
        HeroNode temp = head.next;
//创建一个新链表
        HeroNode rehead = new HeroNode(0,"","");
        HeroNode renext=null;
        while(true){
            if(temp==null){
                break;
            }
            //  将当前指针的下一个结点存给临时变量renext;
            renext = temp.next;
            // 让新链表的前一个结点指向就链表的next结点
            temp.next = rehead.next;
            rehead.next=temp;
//指针后移
            temp = renext;
        }
        head.next = rehead.next;
    }

7、实现链表的逆序打印

 public void reversePrint(){
//创建一个临时结点
        HeroNode temp = head.next;
        if(head.next == null){
            return;
        }
        //创建栈
        Stack<HeroNode> stack = new Stack<>();
        while(true){
            if(temp == null){
                break;
            }
            //将元素压入栈中
            stack.push(temp);
            //指针后移
            temp = temp.next;
        }

        while(stack.size()>0){
            //弹栈
            System.out.print(stack.pop());
        }
    }

VC++手写链表实现任意长度整数加减乘除与幂运算(含完整工程+课程报告) 用纯C++从零实现链表结构,支持超长正整数的四则运算和指数运算,不调用STL容器。输入方式包括键盘手动输入和文件批量读取,输出可显示在控制台或保存为文本文件,结果支持十进制(自动标注位数)和可选二进制格式。所有功能封装在BigInt类中,严格遵循面向对象规范:头文件仅声明接口,实现逻辑分离至.cpp文件,主函数只做调用;允许使用友元函数,禁止全局函数。项目在Visual C++ 6.0及以上版本通过编译,源码含详细中文注释,并提供运行时单次运算耗时统计(秒级精度)。配套《数据结构课程设计.doc》包含完整设 阅读详情

相关推荐

链表基本操作源码

c 语言 链表基本操作,创建 查找 删除 插入 双向链表源码

『初阶数据结构 • C语言』⑨ - 基于结点的数据结构——链表(单链表&&双向循环链表)附完整源码

像数组一样,链表也用来表示一系列的元素。事实上,能用数组来做的事情,一般也可以用链表来做。然而,链表的实现跟数组是不一样的,在不同场景它们会有不同的性能表现。计算机的内存就像一大堆格子,每格都可以用来保存比特形式的数据。当要创建数组时,程序会在内存中找出一组连续的空格子,给它们起个名字,以便你的应用存放数据。我们之前说过,计算机能够直接跳到数组的某一索引上。如果代码要求它读取索引 4的值,那么计算机只需一步就可以完成任务。

花想云的博客 1909

各种形式的链表源码

关于链表的所有代码,包括单链表,循环链表,双端链表,用数组或数据结构为单位的不同链表

链表源码汇总

#include<stdio.h> struct test//定义一个结构体 { int data;//定义数据 struct test *next;//定义结构体下一个 }; void printlink(struct test *head)//定义无类型输出(定义结构体指针头) { struct test *point;//定义结构体指向 point=head;//将头给指向 while(point !=NULL)//当指向不等于空 { printf("%d",point->data)

小浩的博客 418

链表源码实现 链表C实现

这是一个链表的源码 哈哈哈哈哈哈哈哈哈 源码源码源码

链表c代码实现

该代码实现了线性表的链式存储,包括创建线性表、删除线性表、清空线性表、插入元素、删除元素等API函数

【数据结构】第二站:C语言--单链表(附完整源码和注释)

进入链表,链表根据单/双向,是否循环,是否有哨兵位可分成多种,我们只重点选择几个解析,触类旁通,这篇文章的单链表没有带哨兵位的单链表,实现会有很多困难,也正是因为这种结构有问题,所以很容易取得出题者的青睐,单链表实现函数的参数开始使用二级指针,亲自画图成为理解单链表断言、结构的最快方法。

poplar的博客 2470

通用链表库源代码

使用C++编写的通用链表库,小巧方便,管理整个链表之需要一个节点的指针,经过我自己的测试应该是没有什么BUG,这是第一个版本,有兴趣的可以看看

链表常见操作源代码

人,如果不为梦想搏一搏,那和咸鱼又有什么区别呢? 下面是一些链表的源码,仅供参考使用: // 头插法: #include<stdio.h> #include<stdlib.h> struct Book { char title [128]; char author [40]; struct Book *next; }; void getInp...

乐褀的博客 394

【深度学习】肺结节分割项目实战一:处理数据集

一、LIDC-IDRI数据集简介 官方网站 肺图像数据库协会的图像收集(LIDC-IDRI)包括诊断和带有病变注释标记的肺癌筛查胸部CT。这是一个网络公开的国际资源,用于肺癌检测和诊断的计算机辅助诊断(CAD)方法的开发、培训和评估。 数据集包含1018个病例,每个病例包括来自临床胸部CT扫描的图像和一个相关的XML文件,该文件记录了由四名经验丰富的胸部放射科医生进行的两阶段图像注释过程的结果。在最初的盲读阶段,每个放射科医生独立审查每个CT扫描,并标记出属于三种类型之一的病变(“结节>= 3mm”,

weixin_42182906的博客 1万+

Unity物理驱动3D汽车实现:从刚体控制到参数调优

在游戏开发中,刚体物理是实现真实物体运动与交互的核心技术。通过Unity的物理引擎,开发者可以模拟重力、碰撞、摩擦力等物理行为,为游戏世界注入真实感。其技术价值在于能够以符合物理规律的方式驱动游戏对象,避免穿墙、无视惯性等问题,从而提升游戏体验的真实性和沉浸感。这一原理广泛应用于角色控制、车辆模拟、物体破坏等场景。本文以3D小汽车为例,详细解析了如何通过Rigidbody组件施加力与扭矩,并利用C#脚本实现玩家输入逻辑,完成一辆可操控、能碰撞的物理驱动汽车。文中重点探讨了AddForce与角速度控制两种方案

weixin_34380948的博客 501

单链表|附完整源码—c语言版

我们都知道数组在内存中是连续存储的,顺序表就是由链表存储的,它有一个其他数据结构都没有的优点——支持随机访问(就是利用下标访问元素),这可以让其支持一些排序算法的操作。但是顺序表也有一些如下缺点:1. 中间/头部的插入删除,时间复杂度为O(N)2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。3. 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200,我们再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间。

fight_for1的博客 609

【库卡机器人】接线步骤

准备X11插头接线,X11插头可以接入机器人外部安全回路接线,其中外部使能信号线也接在此接口上,如果机器人系统没有配置外部使能装置,那个此接口上的外部使能信号端须短接,短接规则为:20-21、23-22、31-30、33-32。持续按住使能键,保持使能上电状态,分别按住示教器右侧每个轴对应的+或-按键,测试机器人每一个轴是否能正常运行,如果一切正常,说明机器人控制正常,机器人可以正常使用。将一根黄绿色等电位线接入其中的一个接地端,并与机器人的接地端相连,使得控制柜与机器人等电位。

qq_45161762的博客 9442

内核链表超详细讲解(含源码)

Linux内核链表采用无数据域的双向循环链表设计,通过将链表节点嵌入宿主结构体实现通用性管理。其核心特点是:1) 使用list_head结构体仅包含指针;2) 通过container_of宏利用偏移量定位宿主结构体;3) 提供统一操作接口。相比传统链表,具有解耦数据结构、零成本抽象、高内存效率和类型安全等优势,广泛应用于进程管理、设备驱动等内核模块。该设计体现了"组合优于继承"的思想,通过宏展开实现高性能操作,为系统编程提供了优秀的架构范例。

biubiubiuplusplu的博客 2661

ABAP代码检查(Code Review)

1、SLIN 扩展程序检查 也可通过(SE38工具栏->检查-扩展程序检查) 进入 2、ATC 检查 通过<SE38菜单栏-检查-ABAP测试主控室> 或事物代码SCI, 支持自定义检查变式 SCI可以配置检查变式满足特殊需求,配置对象集用于批量检查 3、通过ABAP测试主控室实现统一管理,定期检查作业和监控功能(事务代码ATC) 参考 SLIN...

u012232542的博客 6070

duilib 之 事件--bubbled冒泡事件应用、通用点击事件、进入离开事件、XML样式中直接添加事件

1. box 绑定点击事件 ui::Box *pSmallVideoBox = (ui::Box*)FindControl(L"rightBox"); if (pSmallVideoBox) { auto SwitchVideo = [this](ui::EventArgs* param){ m_bSecScreenIsScale = m_bMainScre...

目前打算换一个工作,有招聘windows c++方向的也欢迎联系,北京、济南 最好 973

C++数据结构与算法:从零实现20个核心,深入理解底层原理与工程实践

数据结构与算法是计算机科学的基石,它们定义了数据的组织方式和问题求解的通用模式。从数组、链表等基础线性结构,到二叉树、哈希表、图等复杂非线性结构,每种结构的设计都体现了对时间与空间效率的权衡。理解其底层原理,例如动态数组的均摊分析、哈希表的冲突解决、平衡树的旋转操作,是进行高效系统设计和性能优化的关键。在工程实践中,这些知识直接应用于数据库索引、缓存系统、网络路由和编译器优化等核心场景。本文聚焦于C++实现,通过手动构建红黑树、哈希表、图算法等20个经典模块,深入探讨内存管理、模板编程和性能优化等实战细节,

weixin_30843605的博客 915

基于YOLOv8的铁路轨道异物检测系统设计与实现

目标检测是计算机视觉领域的核心任务之一,旨在识别图像中特定目标的位置和类别。传统方法主要依赖手工特征(如HOG、SIFT等)和分类器(如SVM),而深度学习方法通过卷积神经网络自动学习特征表示,显著提升了检测性能。YOLO(You Only Look Once)系列算法作为单阶段目标检测的代表,以其高效的检测速度著称。YOLOv8是Ultralytics公司于2023年发布的最新版本,在精度和速度上都有进一步提升。

YOLO 575

手工实现LinkedList

集合LinkedList的底层是由链表来实现的,因此可以根据源码仿写个 package sxt.gaoqi.container; public class JsLinkedList<E> { private Node first; private Node last; private int size; public void add(E obj) { N...

给你更好的 178

RK平台以太网设置中添加代理设置

以太网中配置Configuration的时候可以IpConfiguration的初始化函数来设置代理类型和代理参数。通过添加一个KEY_ETH_PROXY的选项来设置代理的配置,然后再设置以太网静态或者动态的类型时候下发给系统进行设置。

Android系统开发笔记 657

水文仿真软件:HEC-RAS (Hydrologic Engineering Center‘s River Analysis System)_(7).一维非稳态水力模型

自定义脚本是通过编程语言(如 Python)编写的一系列自动化任务,可以帮助用户更高效地处理数据和运行模型。编写脚本:使用 Python 或其他编程语言编写自定义脚本。集成脚本:将脚本集成到 HEC-RAS 中,实现自动化数据处理和模型运行。

kkchenjj的博客 933

C语言数据结构实战:从链表到二叉树,手把手实现与调试指南

数据结构是计算机科学中组织与管理数据的核心框架,它定义了数据元素之间的逻辑关系与存储方式,是算法高效运行的基础。其原理在于通过特定的结构(如线性、树形)来优化数据的增删改查操作,从而提升程序性能。掌握数据结构对于深入理解内存管理、培养工程化思维至关重要,尤其在系统编程和性能敏感场景中价值显著。本文聚焦于C语言环境下的数据结构工程实践,通过具体的链表、栈、队列和二叉树实现案例,详细解析了指针操作、内存管理以及递归等关键技术的应用,并提供了针对内存泄漏、指针错误等常见问题的调试技巧,旨在帮助学习者跨越理论到实践

weixin_30905133的博客 406

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java:实现基于Map的LRU算法(附带源码)

Java:实现基于Map的LRU算法(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 812

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

hashmap底层原理_周末自己动手撸一个 HashMap,美滋滋

对HashMap的思考通过写一个迷你版的HashMap来深刻理解定义接口接口实现看MyHashMap的构造Entry看put如何实现hash函数resize和rehashget实现Test测试运行结果《Java 2019 超神之路》《Dubbo 实现原理与源码解析 —— 精品合集》《Spring 实现原理与源码解析 —— 精品合集》《MyBatis 实现原理与源码解析 —— 精品合集》《Sprin...

weixin_39627697的博客 137

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C语言实现学生管理系统(附带源码)

本文详细介绍了如何使用C语言实现一个学生管理系统,从项目背景、需求分析、算法原理、设计思路、数据结构与核心功能模块,到完整代码实现、代码详细解读,再到项目总结与扩展思考,层层剖析了如何利用C语言构建一个交互式管理系统的全过程。通过本项目,你不仅学到了如何定义结构体、实现链表操作和菜单驱动交互,还掌握了文件I/O和错误处理等关键技术。

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1899

数据结构入门到实战:从核心原理到考研面试与工程应用

数据结构是计算机存储、组织数据的方式,其核心原理包括数组、链表、栈、队列、树、图及哈希表等结构的定义与操作,以及对应的时间与空间复杂度分析。掌握这些基础原理,不仅能为排序算法、查找算法等经典问题提供理论支撑,更直接影响数据库索引、缓存设计、Redis底层实现等真实工程系统的性能表现。在技术面试与考研中,链表反转、二叉树遍历、哈希冲突处理等知识点更是高频考点。从课堂理论到工程实践,理解不同数据结构的适用场景与取舍,是每个开发者构建高效程序的必备能力。本文梳理了数据结构核心知识体系,并结合Redis、游戏开发等

weixin_30443731的博客 394
上一篇: 【java集合】手搓ArrayList方法底层源码,超详细
下一篇: JAVA-JDBC基础知识
v1xiaolin
博客等级 码龄8年 559粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值