数据结构----单链表增删改查
单链表的增删改查
一、链表(Linked List)
- 链表是有序列表,以节点的方式来存储的,链式存储;
- 每个节点包含data域,next域:指向下一节点;
- 链表的各个节点不一定是连续存储;
- 链表分为带头节点的链表和不带头结点的链表,根据实际需求来确定。
二、单链表的增删改查
1. 增
- 往单链表中添加内容(按照输入顺序添加—普通添加)
public void add(HeroNode heroNode) {
// 因为head节点不能动,因此我们需要一个辅助遍历tempHeroNode temp = head;
// 遍历链表,找到最后while (temp.next != null) {// 如果没有找到最后,将temp 后移temp = temp.next;}
// 当退出while循环时,temp就指向了链表的最后
// 将最后这个节点的next指向新的节点temp.next = heroNode;}
- 往单链表中添加内容(按照排名添加,即使输入是乱序的----有序添加)
public void addByOrder(HeroNode heroNode) {// 因为头节点不能动,仍然通过一个辅助指针来帮助找到添加的位置
// 因为是单链表,因为找的temp是位于添加位置的前一个节点,否则插入不了HeroNode temp = head;
// flag标志添加的编号是否存在,默认为falseboolean flag = false;while (true) {if (temp.next == null) {break;}
// 位置找到了,就在temp的后面插入if (temp.next.no > heroNode.no) {break;} else if (temp.next.no == heroNode.no) {
// 说明希望添加的heroNode的编号已然存在
// 说明编号存在flag = true;break;}
// 后移,遍历当前链表temp = temp.next;}
// 判断flag的值if (flag) {
// 不能添加,说明编号存在System.out.printf("输入的编号%d已存在,无法加入\n", heroNode.no);} else {
// 插入到链表中temp后面heroNode.next = temp.next;temp.next = heroNode;}}
- 修改单链表中的内容(编号不能动,修改编号对应的内容)
2. 删
- 从单链表中删除一个节点的思路:
- 找到待删除节点前一个节点temp
- temp.next = temp.next.next
- 被删除的节点将不会有其他的引用指向,会被垃圾回收机制回收
// 删除节点的方法,head节点不能动public void deleteNode(int no) {HeroNode temp = head;
// 标识是否找到待删除节点boolean flag = false;while (true) {if (temp.next == null) {System.out.println("已经到了链表最后了");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);}}
3. 改
public void updateInfo(HeroNode newHeroNode) {
// 定义辅助变量HeroNode temp = head.next;boolean flag = false;if (temp == null) {System.out.println("链表为空");return;}while (true) {if (temp == null) {
// 已经遍历到了链表的最后一个break;}if (temp.no == newHeroNode.no) {
// 已经找到了flag = true;break;}
// 遍历链表temp = temp.next;}if (flag) {temp.name = newHeroNode.name;temp.nickname = newHeroNode.nickname;} else {System.out.printf("没有找到编号 %d 的链表,不能修改\n", newHeroNode.no);}}
4. 查
查看链表内容
// 显示链表[遍历]public void list() {
// 判断链表是否为空if (head.next == null) {System.out.println("链表为空");return;}
// 因为头节点不能动,因此需要一个辅助变量来遍历HeroNode temp = head.next;while (temp != null) {
// 输出节点信息System.out.println(temp);
// 将temp后移,一定要后移,因为是死循环temp = temp.next;}}
全部代码
代码结构
package com.starking.linkedlist;/*** @author Manix*/public class SingleLinkedListDemo {public static void main(String[] args) {// 创建节点HeroNode hero1 = new HeroNode(1, "量子计算机", "九章");HeroNode hero2 = new HeroNode(2, "火星", "天问");HeroNode hero3 = new HeroNode(3, "嫦娥", "月球");HeroNode hero4 = new HeroNode(4, "运20", "胖妞");HeroNode hero5 = new HeroNode(3, "嫦娥6", "玉兔");// 创建链表SingLinkedList singLinkedList = new SingLinkedList();
// 添加英雄singLinkedList.addByOrder(hero1);singLinkedList.addByOrder(hero3);singLinkedList.addByOrder(hero2);singLinkedList.addByOrder(hero4);System.out.println("修改之前的链表");singLinkedList.list();// 修改3号英雄的名称和昵称singLinkedList.updateInfo(hero5);System.out.println("修改之后的链表");singLinkedList.list();// 删除一个节点测试singLinkedList.deleteNode(1);System.out.println("删除之后的链表");singLinkedList.list();}
}//定义SingleLinkedList管理我们的英雄
class SingLinkedList {
// 初始化头节点,不存放具体数据HeroNode head = new HeroNode(0, "", "");// 添加节点到单向链表
// 思路:当不考虑编号顺序时
// 1. 找到当前链表的最后节点
// 2. 将最后这个节点的next指向新的节点public void add(HeroNode heroNode) {
// 因为head节点不能动,因此我们需要一个辅助遍历tempHeroNode temp = head;
// 遍历链表,找到最后while (temp.next != null) {// 如果没有找到最后,将temp 后移temp = temp.next;}
// 当退出while循环时,temp就指向了链表的最后
// 将最后这个节点的next指向新的节点temp.next = heroNode;}// 更新编号对应的名字和昵称的方法,编号不能修改public void updateInfo(HeroNode newHeroNode) {
// 定义辅助变量HeroNode temp = head.next;boolean flag = false;if (temp == null) {System.out.println("链表为空");return;}while (true) {if (temp == null) {
// 已经遍历到了链表的最后一个break;}if (temp.no == newHeroNode.no) {
// 已经找到了flag = true;break;}
// 遍历链表temp = temp.next;}if (flag) {temp.name = newHeroNode.name;temp.nickname = newHeroNode.nickname;} else {System.out.printf("没有找到编号 %d 的链表,不能修改\n", newHeroNode.no);}}// 第二种添加英雄的方法,根据英雄排名插入到指定位置
// 如果有这个排名,则添加失败,并给出提示public void addByOrder(HeroNode heroNode) {// 因为头节点不能动,仍然通过一个辅助指针来帮助找到添加的位置
// 因为是单链表,因为找的temp是位于添加位置的前一个节点,否则插入不了HeroNode temp = head;
// flag标志添加的编号是否存在,默认为falseboolean flag = false;while (true) {if (temp.next == null) {break;}
// 位置找到了,就在temp的后面插入if (temp.next.no > heroNode.no) {break;} else if (temp.next.no == heroNode.no) {
// 说明希望添加的heroNode的编号已然存在
// 说明编号存在flag = true;break;}
// 后移,遍历当前链表temp = temp.next;}
// 判断flag的值if (flag) {
// 不能添加,说明编号存在System.out.printf("输入的编号%d已存在,无法加入\n", heroNode.no);} else {
// 插入到链表中temp后面heroNode.next = temp.next;temp.next = heroNode;}}// 显示链表[遍历]public void list() {
// 判断链表是否为空if (head.next == null) {System.out.println("链表为空");return;}
// 因为头节点不能动,因此需要一个辅助变量来遍历HeroNode temp = head.next;while (temp != null) {
// 输出节点信息System.out.println(temp);
// 将temp后移,一定要后移,因为是死循环temp = temp.next;}}// 删除节点的方法,head节点不能动public void deleteNode(int no) {HeroNode temp = head;
// 标识是否找到待删除节点boolean flag = false;while (true) {if (temp.next == null) {System.out.println("已经到了链表最后了");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);}}}//定义一个HeroNode,每个HeroNode对象就是一个节点
class HeroNode {public int no;public String name;public String nickname;public HeroNode next;// 构造器public HeroNode(int no, String name, String nickname) {this.no = no;this.name = name;this.nickname = nickname;}// 为了显示方法,我们重写toString@Overridepublic String toString() {return "HeroNode{" +"no=" + no +", name='" + name + '\'' +", nickname='" + nickname + "'" +'}';}
}
运行结果
相关文章:

Using NUnit with Visual Studio 2005 Express Editions
允许通过Build Toolbar选择"Debug" or "Relese"设置"工具" -> "选项..." -> 选择"显示所有设置" -> "项目和解决方案" ->选择"显示高级生成配置" 在VS2k5 Express工程中使用NUnit-GUI测试&…

代理上网环境下配置TortoiseCVS
以NASA Wind World为例,SF上的提示如下: http://sourceforge.net/cvs/?group_id69528 Anonymous CVS Access This projects SourceForge.net CVS repository can be checked out through anonymous (pserver) CVS with the following instruction set.…

ucos-iii串口用信号量及环形队列中断发送,用内建消息队列中断接收
串口发送部分代码: //通过信号量的方法发送数据 void usart1SendData(CPU_INT08U ch) {OS_ERR err;CPU_INT08U isTheFirstCh;OSSemPend(&Usart1Sem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);//阻塞型等待串口发送资源OSSemPend(&Usart1TxBufSem, 0, OS_O…

几款自用的IDEA高效插件
idea几款自用的高效小插件1、CodeGlance2、Translation3、Rainbow Brackets4、Statistic5、Markdown Navigator6、MarkDown Navigator1、CodeGlance CodeGlance是一款非常好用的代码地图插件,可以在代码编辑区的右侧生成一个竖向可拖动的代码缩略区,可以…

CSS中position属性( absolute | relative | static | fixed )详解
我们先来看看CSS3 Api中对position属性的相关定义: static:无特殊定位,对象遵循正常文档流。top,right,bottom,left等属性不会被应用。 relative:对象遵循正常文档流,但将依据top&am…

ASP.NET 2.0 ajax中gridView的刷新问题!
我是一个经常使用ASP.NET2.0的开发人员,最近看了ajax课程,也想使用一下Ajax这个强大的技术,我就使用了,在一个UpdatePanel中放入了一个gridView,果然能达我的满意效果,设置了gridView中的分页,相应的代码我都已经写好了.唯一的问题是当我点击了第二页的时候,我再点击刷新,当前页…

心灵小栈: 镌刻在地下500米的母爱
这位母亲叫赵平饺,今年48岁。谁能想到,在不见天日的煤井深处,她已经弓着脊梁爬行了13 年。1993年,赵平姣的丈夫陈达初在井下作业时被矿车压断了右手的三根手指。此后他只能在井上干轻活,收入少了一大截。为了供女儿陈娟…

js学习总结----crm客户管理系统之项目开发流程和api接口文档
CRM ->客户管理系统 CMS ->内容发布管理系统 ERP ->企业战略信息管理系统 OA -> 企业办公管理系统 产品 / UI设计:需求分析,产品定位,市场调查...按照产品的规划设计出对应的效果图(PSD->photoshop) 前端开发工程师 API接口文…

数据结构--数组队列的实现
数据结构--数组模拟队列1. 说明2. 实现代码1. 数组队列类2.数组队列测试类3.代码运行结果3.完整代码1. 说明 队列是一个有序列表,可以用数组或者链表来实现。 遵循先入先出(FIFO)的原则,即先存入列的数据,会被先取出&…

DIV+CSS一行两列布局
实现效果: main 我是包在外面的div col1 我是第一列col2 我是第二列clear-float;我用来清除浮动(清除float)以下是说明:CSS代码:.main{width:800px;/* 总的宽度 */ background:red; } .main .col1{ float:left;/* 这个…

编程上标和下标使用方法
1.问题:写代码要求显示平方、立方、化学符号等等完全写不出来,Word写出来复制出来也不管用 2.办法:Unicode下标和上标 3.举例:string.Format("{0} km\xB2",1000),单位是平方千米&…

上周新闻回顾:微软补丁个个紧急 奥运网络百花齐放
也许是美国不是黄金周的原因,五一刚过,直接来自国外的新产品发布等IT新闻就源源不断涌来,倒是国内的新闻发布不是非常多。不过,微软的5月安全补丁如期发布,还是值得大家关注的。此外,关于2008年奥运会网络建…

rest-framework之解析器
rest-framework之解析器 本文目录 一 解析器的作用二 全局使用解析器三 局部使用解析器四 源码分析回到目录一 解析器的作用 根据请求头 content-type 选择对应的解析器对请求体内容进行处理。 有application/json,x-www-form-urlencoded,form-data等格式…

httpd常用配置
author:JevonWei版权声明:原创作品 检查配置文件时,如下提示,则因为没有server的服务名称导致,故设置网站的服务server名称,若没有设置web服务名,主默认解析系统主机名(添加主机名解析) [rootda…

[导入]C#中实现Socket端口复用
一、什么是端口复用: 因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分。这种多重绑定便称之为端口复用。 二、…

数据结构学习系列文章合集
数据结构学习系列文章目录前言1.稀疏数组和队列稀疏数组和二位数组的转换数组队列的实现环形队列的介绍与实现2.链表单链表的增、删、改、查总结前言 学习数据结构记录,作为自己的笔记,同时也可以方便大家一起交流和学习 1.稀疏数组和队列 稀疏数组和二…

支付宝Payto接口的c#.net实现
它现在这种支付方式比较多象网银在线等使用的方法都是url验证,就是通过url参数和一个这些url参数的md5编码来确认这个连接的正确性,支付宝在你购买成功后跳转自定义连接的时候会传2次过来,第一次是数据底层请求,第二次是web请求&a…

【Visual Studio 扩展工具】如何在ComponentOneFlexGrid树中显示RadioButton
概述 在ComponentOne Enterprise .NET控件集中,FlexGrid表格控件是用户使用频率最高的控件之一。它是一个功能强大的数据管理工具,轻盈且灵动,以分层的形式展示数据(数据呈现更加直观)。 FlexGrid 简介 FlexGrid 是业界…

如何 SQL Server 2005 实例之间传输登录和密码
INTRODUCTION 本文介绍如何不同服务器上的 Microsoft SQL Server 2005 实例之间传输登录和密码。 本文, 服务器 A 和服务器 B 是不同的服务器。 此外, 服务器 A 和 B 服务器都运行 SQL Server 2005。 将数据库从服务器 A 上的 SQLServer 实例移到 B, 服务器上的 SQLServer 实例…

IDEA配置GitHub报错GitHub Invalid authentication data.404 Not Found-Not Found
登录账户GitHub Invalid authentication data.404 Not Found-Not Found报错及解决办法1 登录自己的github账号--》头像---》settting2 Developer settings3 Personal access tokens4 回到IDEA中,粘贴上自己的token就可以了想要把自己的代码上传到GitHub中࿰…

console.log 简写
console.log 简写 平常代码调试总会用到console.log,但是每次写这么长也是很麻烦,就想着存一个简介一点的变量; 然后就随手写了下面代码; var a 10;var log console.log;log(a);调用的时候发现火狐浏览器报错了,仔细…

为何我的BLOG不能DIY?
今天想把MODULE调整一下,居然搞不定。估计是服务器又出问题了........不知道51CTO有没有备份我们的博克呀?

Java中的自动装箱和拆箱
自动装箱和拆箱自动装箱和拆箱自动装箱:拆箱1. 为什么要有包装类(或封装类)2. 基本数据类型与对应的包装类:3. 类型间的转换4. 何时发生自动装箱和拆箱赋值、数值运算时方法调用时:自动装箱、拆箱中的坑自动装箱和拆箱 目的&…

【Java】身份证号码验证
代码引用自:https://gitee.com/appleat/codes/ynrtqujv0wfgesm8ia9b547 1 package xxx;2 3 /**4 * Created by wdj on 2017/6/21.5 */6 7 import java.text.ParseException;8 import java.text.SimpleDateFormat;9 import java.util.Calendar;10 import java.util…

linux history记录格式修改
#保存一万条命令记录 sed -i s/^HISTSIZE1000/HISTSIZE10000/g /etc/profile#在/etc/profile的文件尾部添加如下行数配置信息 ######jiagu history xianshi######### USER_IPwho -u am i 2>/dev/null | awk {print $NF} | sed -e s/[()]//g if [ "$USER_IP" &quo…

从EAI到SOA
写在前面SOA现在越发闹腾的厉害了,各种宣传越来越多,都把SOA吹上天;到底SOA是什么,有啥神奇之处,真的想宣传说的那么好吗?看了种种文章,只是越发混沌。罢了,俺做技术的,商…

用C#实现FTP搜索引擎
晚辈最近用C#写了一个教育网FTP搜索引擎,希望能得到高手的指点。 网址:http://soso.ccnu.com.cn http://it.ccnu.edu.cn/soso 部分代码: using System;using softplib;using System.Threading;using System.Collections;using System.Ne…

IDEA配置GitHub和Gitee
IDEA配置GitHub和GiteeIDEA配置GitHub和GiteeGit准备IDEA内配置Git配置GitHub1. IDEA的Settings-->Version Control ---> GitHub2. 登录账户GitHub Invalid authentication data.404 Not Found-Not Found报错及解决办法2.1 登录自己的github账号--》头像---》settting2.2…
MATLAB 2014a (8.3) Compiler Runtime (MCR)
在安装的时候可以 ./install -H 界面化安装到自己目录下 MATLAB 2014a (8.3) Runtime Compiler (MCR) Errors when trying to launch deployed (using deploy tool) application in Ubuntu 13.04. Right after installation of MCR if one runs the deployed application follo…

[Quiz]竞赛题目 Word Trace
一、竞赛题目Problem Statement You are given a String[] grid representing a rectangular grid of letters. You are also given a String find, a word you are to find within the grid. The starting point may be anywhere in the grid. The path may move up, down, le…