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. 使用 VMware Workstation Pro 让 PC 提供云桌面服务——学习笔记(二)

    实验效果: 这次希望的效果是能够用远程桌面来实现 . 这里参考了博客 https://www.cnblogs.com/wwang/archive/2011/01/06/1928933.html 操作步 ...

  2. My_Tomcat_Host 靶机

    1:扫描网段: 发现主机IP为192.168.1.203 2:nmap 扫描端口信息 发现8080端口开启了http服务  22ssh服务 3:尝试ssh连接是需要密码的,然后访问8080端口 4:发 ...

  3. day7 地址 名片管理系统

    1 无限循环  (while  True)   break 退出     人为设计的 ,并且有退除的出口      死循环 bug  错误 2.引用   数字型

  4. Elasticsearch聚合语句

    聚合的范围是search query过滤出的数据 四种聚合类型: 一.Bucketing 桶聚合,常规的分类然后计算每个分类的文档数量 二.Metric 分类并对一组文档进行sum.avg等数学运算 ...

  5. Nginx同时支持Http和Https

    现在的网站支持Https几乎是标配功能,Nginx能很好的支持Https功能.下面列举一个配置同时支持Http和Https的功能. 需要注意的是:既然选择使用Https,就是为了保证通信安全,那么就没 ...

  6. 输入url后的加载过程~

    1)查找域名对应的IP地址: 2)建立连接(TCP的三次握手): 3)构建网页: 4)断开连接(TCP的四次挥手): TCP的三次握手:为了准确无误的把数据送到目标处,TCP协议采用了三次握手策略,用 ...

  7. Oracle 根据单元格内容不同来判断不同条件

    select xxx,xxx from xxx where decode(AAA,0,BBB,1,CCC)='12345' 如果AAA字段等于0则AAA=''12345' 否则如果BBB字段等于1则B ...

  8. linux 安装sftp

    1.定义sftp的数据目录 mkdir -p /data/sftp 2.将目录归到root用户,否则无法chroot chown root. -R /data/sftp/或者chown root:ro ...

  9. Java 中几种常用设计模式

    Java 中一般认为有23种设计模式,当然暂时不需要所有的都会,但是其中常见的几种设计模式应该去掌握. 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模 ...

  10. MySQL SQL概述

    MySQL SQL概述 数据库的好处: •实现数据持久化 •使用完整的管理系统统一管理易 数据库的概念: DB:数据库(database):存储数据的“仓库”.它保存了一系列有组织的数据. DBMS: ...