Linked List 单向链表
Linked List
链表的理解
小结
- 链表是以节点的方式来储存的
- 每个节点包括 data域:存放数据,next域:指向下一个节点
- 如图:发现链表的各个节点不一定是连续储存的
- 链表分为带头节点的链表和没有头结点的链表,这样根据实际需求而定。
单向链表
添加
添加到最后
- 找到链表的最后一个节点[通过节点的
next == null]
- 将最后这个节点的
next
指向新的节点
//初始化一个头结点,里面什么都不放
HeroNode head = new HeroNode(0, "", "");
/**
* 向链表中添加一个节点
* 不考虑编号顺序
*/
public void add(HeroNode heroNode) {
//因为头节点是不能动的,使用中间变量temp来保存头节点
HeroNode temp = head;
//遍历节点,找到最后一个节点【通过最后一个节点next指向为 null】
while (true) {
if (temp.next == null) {
//找到最后一个节点
break;
}
//没有找到就将temp后移一个
temp = temp.next;
}
// 当循环退出的时候temp就指向节点的最后一个
temp.next = heroNode;
}
考虑编号顺序添加
找到新添加节点的位置,通过辅助变量(
temp
)[遍历找到新节点的位置]新的节点.next = temp.next
temp.next = 新的节点
/**
* 考虑排序编号添加
*
* @param heroNode
*/
public void addByOrder(HeroNode heroNode) {
//因为头节点是不能动的,使用辅助变量temp寻找位置
HeroNode temp = head;
//用来代表当前添加的节点的编号是否存在,默认false不存在
boolean flag = false;
while (true) {
if (temp.next == null) {
//当前temp为链表最后一个
break;
}
if (temp.next.no > heroNode.no) {
//找到需要添加的位置,就在temp后面添加
break;
} else if (temp.next.no == heroNode.no) {
//需要添加的节点已经存在
flag = true;
break;
}
//三个条件不成立 temp后移
temp = temp.next;
}
if (flag) {
//不能添加,编号存在
System.out.printf("当前添加的英雄编号 %d 已经存在, 不能添加\n", heroNode.no);
} else {
//在temp后面进行添加
heroNode.next = temp.next;
temp.next = heroNode;
}
}
修改
- 使用
temp.no == newHeroNode.no
判断是否为需要修改的节点
/**
* 更新节点
*
* @param newHeroNode
*/
public void update(HeroNode newHeroNode) {
if (head.next == null) {
System.out.println("当前链表为空");
return;
}
//因为头节点是不能动的,使用中间变量temp来保存头节点
HeroNode temp = head;
boolean flag = false; //用来表示链表中是否存在需要修改的节点
while (true) {
if (temp.next == null) {
break;
}
if (temp.no == newHeroNode.no) {
flag = true;
break;
}
temp = temp.next; //temp后移
}
if (flag) {
temp.name = newHeroNode.name;
temp.nickName = newHeroNode.nickName;
} else {
System.out.printf("没有找到编号为:%d 节点", newHeroNode.no);
}
}
删除
- 找到需要删除的节点的前一个节点
temp
temp.next = temp.next.next
- 被删除的节点 将不会有其他引用指向,会被垃圾回收机制回收
/**
* 删除节点
*
* @param no
*/
public void del(int no) {
if (head.next == null) {
System.out.println("当前链表为空");
return;
}
//因为头节点是不能动的,使用中间变量temp来保存头节点
HeroNode temp = head;
boolean flag = false; //表示是否找到需要删除的节点
while (true) {
if (temp.next == null) {
break;
}
if (temp.next.no == no) {
flag = true;
break;
}
temp = temp.next;
}
//删除需要删除的节点
if (flag) {
temp.next = temp.next.next;
} else {
System.out.printf("不存在编号为 %d 的节点 删除失败\n", no);
}
}
dataStructures: gitee
dataStructures: github
Linked List 单向链表的更多相关文章
- Leetcode 160 Intersection of Two Linked Lists 单向链表
找出链表的交点, 如图所示的c1, 如果没有相交返回null. A: a1 → a2 ↘ ...
- python数据结构——单向链表
链表 ( Linked List ) 定义:由许多相同数据类型的数据项按照特定顺序排列而成的线性表. 特点:各个数据在计算机中是随机存放且不连续. 优点:数据的增删改查都很方便,当有新的数据加入的时候 ...
- Reverse Linked List II 单向链表逆序(部分逆序)
0 问题描述 原题点击这里. 将单向链表第m个位置到第n个位置倒序连接.例如, 原链表:1->2->3->4->5, m=2, n =4 新链表:1->4->3-& ...
- 如何判断一个单向链表是否为回文链表(Palindrome Linked List)
题目:给定一个单向链表,判断它是不是回文链表(即从前往后读和从后往前读是一样的).原题见下图,还要求了O(n)的时间复杂度O(1)的空间复杂度. 我的思考: 1,一看到这个题目,大脑马上想到的解决方案 ...
- [置顶] ※数据结构※→☆线性表结构(list)☆============单向链表结构(list single)(二)
单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始:链表是使用指针进行构造的列表:又称为结点列表,因为链表是由一个个结点组装起来的:其中每个结点都有指 ...
- C#学习单向链表和接口 IList<T>
C#学习单向链表和接口 IList<T> 作者:乌龙哈里 时间:2015-11-04 平台:Window7 64bit,Visual Studio Community 2015 参考: M ...
- python中的单向链表实现
引子 数据结构指的是是数据的组织的方式.从单个数据到一维结构(线性表),二维结构(树),三维结构(图),都是组织数据的不同方式. 为什么需要链表? 顺序表的构建需要预先知道数据大小来申请连续的存储空间 ...
- [LeetCode] Design Linked List 设计链表
Design your implementation of the linked list. You can choose to use the singly linked list or the d ...
- Alan Cox:单向链表中prev指针的妙用
之前发过一篇二级指针操作单向链表的例子,显示了C语言指针的灵活性,这次再探讨一个指针操作链表的例子,而且是一种完全不同的用法. 这个例子是linux-1.2.13网络协议栈里的,关于链表遍历& ...
随机推荐
- Homekit_人体感应器
前置需求: 苹果手机一台 Homekit人体感应一台 USB供电线一根 这款产品内置人体红外感应器,使用圆环设计,增大了其接触面积,使感应变得更加灵敏,重量轻,方便将其粘贴到墙上,同时支持二次开发,如 ...
- 域名备案&robots协议
目录 1 域名备案 个人备案 公司备案 备案完成之后 了解更多 2 robots.txt 这篇文章不谈技术,聊一聊笔者在网站建设一些需要注意的点. 1 域名备案 建设一个网站一定会需要域名,而域名又一 ...
- 【Codeforces】CF Round #592 (Div. 2) - 题解
Problem - A Tomorrow is a difficult day for Polycarp: he has to attend \(a\) lectures and \(b\) prac ...
- MySQL 偶尔抽风,性能突然下降
有时会碰到这样的情况,一条 SQL 在平时执行没问题,很快.但是突然某个时间执行的就会很慢,而且这种场景并不能复现,只能随机发送的. SQL 执行突然变慢的原因 在之前讲解 MySQL Redo lo ...
- 数据恢复----重组raid5解析
重组Raid5 第一步:判断RAID5条带大小 利用winhex同时打开6个物理镜像每块成员盘中的$MFT文件记录(16进制搜索“46494c45”),并且保证找到的文件记录在每块物理盘的同一扇区(在 ...
- git pull冲突的解决方案
处理步骤: 1.先将本地修改存储起来 $ git stash 这样本地的所有修改就都被暂时存储起来 .使用git stash list可以看到保存的信息: git stash暂存修改 其中stash@ ...
- ElasticSearch实战系列八: Filebeat快速入门和使用---图文详解
前言 本文主要介绍的是ELK日志系统中的Filebeat快速入门教程. ELK介绍 ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是 ...
- Cannot instantiate the type ......的解决
使用public abstract class MainWindow implements ActionListener{} 之后创建对象MainWindow window = new MainWin ...
- Jmeter 常用函数(18)- 详解 __isDefined
如果你想查看更多 Jmeter 常用函数可以在这篇文章找找哦 https://www.cnblogs.com/poloyy/p/13291704.htm 作用 判断 Jmeter 变量是否存在,1 就 ...
- JavaScript学习系列博客_3_JavaScript中的变量、常量、标识符
常量:就是改变不了的,也是可以直接使用的. 变量:可以改变的,不确定的. var =123456; 通过 var 声明一个变量,同时赋值给它 标识符:在JS中所有的可以自主命名的内容,都可以认为是一个 ...