Linked List

链表的理解

小结

  1. 链表是以节点的方式来储存的
  2. 每个节点包括 data域:存放数据,next域:指向下一个节点
  3. 如图:发现链表的各个节点不一定是连续储存的
  4. 链表分为带头节点的链表和没有头结点的链表,这样根据实际需求而定。

单向链表

添加

添加到最后
  1. 找到链表的最后一个节点[通过节点的next == null]
  2. 将最后这个节点的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;
}
考虑编号顺序添加
  1. 找到新添加节点的位置,通过辅助变量(temp)[遍历找到新节点的位置]

  2. 新的节点.next = temp.next

  3. 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);
}
}

删除

  1. 找到需要删除的节点的前一个节点temp
  2. temp.next = temp.next.next
  3. 被删除的节点 将不会有其他引用指向,会被垃圾回收机制回收
 /**
* 删除节点
*
* @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 单向链表的更多相关文章

  1. Leetcode 160 Intersection of Two Linked Lists 单向链表

    找出链表的交点, 如图所示的c1, 如果没有相交返回null. A:             a1 → a2                               ↘               ...

  2. python数据结构——单向链表

    链表 ( Linked List ) 定义:由许多相同数据类型的数据项按照特定顺序排列而成的线性表. 特点:各个数据在计算机中是随机存放且不连续. 优点:数据的增删改查都很方便,当有新的数据加入的时候 ...

  3. Reverse Linked List II 单向链表逆序(部分逆序)

    0 问题描述 原题点击这里. 将单向链表第m个位置到第n个位置倒序连接.例如, 原链表:1->2->3->4->5, m=2, n =4 新链表:1->4->3-& ...

  4. 如何判断一个单向链表是否为回文链表(Palindrome Linked List)

    题目:给定一个单向链表,判断它是不是回文链表(即从前往后读和从后往前读是一样的).原题见下图,还要求了O(n)的时间复杂度O(1)的空间复杂度. 我的思考: 1,一看到这个题目,大脑马上想到的解决方案 ...

  5. [置顶] ※数据结构※→☆线性表结构(list)☆============单向链表结构(list single)(二)

    单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始:链表是使用指针进行构造的列表:又称为结点列表,因为链表是由一个个结点组装起来的:其中每个结点都有指 ...

  6. C#学习单向链表和接口 IList<T>

    C#学习单向链表和接口 IList<T> 作者:乌龙哈里 时间:2015-11-04 平台:Window7 64bit,Visual Studio Community 2015 参考: M ...

  7. python中的单向链表实现

    引子 数据结构指的是是数据的组织的方式.从单个数据到一维结构(线性表),二维结构(树),三维结构(图),都是组织数据的不同方式. 为什么需要链表? 顺序表的构建需要预先知道数据大小来申请连续的存储空间 ...

  8. [LeetCode] Design Linked List 设计链表

    Design your implementation of the linked list. You can choose to use the singly linked list or the d ...

  9. Alan Cox:单向链表中prev指针的妙用

    之前发过一篇二级指针操作单向链表的例子,显示了C语言指针的灵活性,这次再探讨一个指针操作链表的例子,而且是一种完全不同的用法. 这个例子是linux-1.2.13网络协议栈里的,关于链表遍历& ...

随机推荐

  1. C#LeetCode刷题-回溯算法

    回溯算法篇 # 题名 刷题 通过率 难度 10 正则表达式匹配   18.8% 困难 17 电话号码的字母组合   43.8% 中等 22 括号生成   64.9% 中等 37 解数独   45.8% ...

  2. Vue 页面导出成PDF文件

    注意事项 如果导出的页面中设计到图片或者其他文件跨域文件,需要后端服务配合 安装依赖 npm install html2Canvas --save npm install jspdf--save 封装 ...

  3. go 字符串

    目录 前言 1.声明/赋值 2.遍历 3.操作 1.截取 2.修改 3.连接 4.比较 5.查长 6.格式化输出 4.字符串优势 跳转 前言 不做文字的搬运工,多做灵感性记录 这是平时学习总结的地方, ...

  4. FCIS:Fully Convolutional Instance-aware Semantic Segmentation

    论文:Fully Convolutional Instance-aware Semantic Segmentation   目录 0.简介 1.Position-sensitive Score Map ...

  5. docker入门1-docker container

    image和container介绍 一个image是一个可被docker执行的包,它包括程序运行的所有东西,包括代码,运行时,库,环境变量和配置文件. 一个container是image在内存中的运行 ...

  6. 一个简单的例子让你很轻松地明白JavaScript中apply、call、bind三者的用法及区别

    JavaScript中apply.call.bind三者的用法及区别 引言 正文 一.apply.call.bind的共同用法 二. apply 三. call 四. bind 五.其他应用场景 六. ...

  7. idea生成SpringBoot项目后再次调出依赖

    插眼 https://www.cnblogs.com/cosmos-wong/p/12908580.html

  8. Jmeter 常用函数(11)- 详解 __TestPlanName

    如果你想查看更多 Jmeter 常用函数可以在这篇文章找找哦 https://www.cnblogs.com/poloyy/p/13291704.html 作用 返回测试计划名称 语法格式 ${__T ...

  9. java基本数据类型总结 类型转换 final关键字的用法

    java基本数据类型总结 Java数据类型总结 数据类型在计算机语言里面,是对内存位置的一个抽象表达方式,可以理解为针对内存的一种抽象的表达方式.接触每种语言的时候,都会存在数据类型的认识,有复杂的. ...

  10. vimrc备份

    备份一下我的 gvim 配置文件 " 使vimrc文件立马生效 autocmd BufWritePost $MYVIMRC source $MYVIMRC " 设置自己的Leade ...