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网络协议栈里的,关于链表遍历& ...
随机推荐
- 使用 VMware Workstation Pro 让 PC 提供云桌面服务——学习笔记(二)
实验效果: 这次希望的效果是能够用远程桌面来实现 . 这里参考了博客 https://www.cnblogs.com/wwang/archive/2011/01/06/1928933.html 操作步 ...
- My_Tomcat_Host 靶机
1:扫描网段: 发现主机IP为192.168.1.203 2:nmap 扫描端口信息 发现8080端口开启了http服务 22ssh服务 3:尝试ssh连接是需要密码的,然后访问8080端口 4:发 ...
- day7 地址 名片管理系统
1 无限循环 (while True) break 退出 人为设计的 ,并且有退除的出口 死循环 bug 错误 2.引用 数字型
- Elasticsearch聚合语句
聚合的范围是search query过滤出的数据 四种聚合类型: 一.Bucketing 桶聚合,常规的分类然后计算每个分类的文档数量 二.Metric 分类并对一组文档进行sum.avg等数学运算 ...
- Nginx同时支持Http和Https
现在的网站支持Https几乎是标配功能,Nginx能很好的支持Https功能.下面列举一个配置同时支持Http和Https的功能. 需要注意的是:既然选择使用Https,就是为了保证通信安全,那么就没 ...
- 输入url后的加载过程~
1)查找域名对应的IP地址: 2)建立连接(TCP的三次握手): 3)构建网页: 4)断开连接(TCP的四次挥手): TCP的三次握手:为了准确无误的把数据送到目标处,TCP协议采用了三次握手策略,用 ...
- Oracle 根据单元格内容不同来判断不同条件
select xxx,xxx from xxx where decode(AAA,0,BBB,1,CCC)='12345' 如果AAA字段等于0则AAA=''12345' 否则如果BBB字段等于1则B ...
- linux 安装sftp
1.定义sftp的数据目录 mkdir -p /data/sftp 2.将目录归到root用户,否则无法chroot chown root. -R /data/sftp/或者chown root:ro ...
- Java 中几种常用设计模式
Java 中一般认为有23种设计模式,当然暂时不需要所有的都会,但是其中常见的几种设计模式应该去掌握. 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模 ...
- MySQL SQL概述
MySQL SQL概述 数据库的好处: •实现数据持久化 •使用完整的管理系统统一管理易 数据库的概念: DB:数据库(database):存储数据的“仓库”.它保存了一系列有组织的数据. DBMS: ...