前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、链表介绍
1.链表在内存中的存储(真实存储)
链表:
1,链表以节点的方式来存储,是链式存储
2,每个节点包含一个date域,next域指向下一个节点
3,链表的各个节点不一定是连续存储
4,链表分带头节点的链表和不带头节点的链表,根据实际需求来确定
2.单链表(带头节点)逻辑结构
二、单向链表的实现
1.不考虑编号顺序时,添加英雄分析
2.不考虑编号顺序时,添加英雄代码
代码如下(示例):
//定义 SingleLinkedList管理HeroNode节点对象
class SingleLinkedList{
//先创建一个头节点,作用就是表示单链表的头,头节点不动,不存放具体的数据
private HeroNode head=new HeroNode(0,"","");
/**
* 添加节点到单向链表:(当不考虑编号顺序时)
* 1,找到当前链表的最后节点
* 2,将最后这个节点的next指向新的节点
*/
public void add(HeroNode heroNode){
//1,找到当前链表的最后节点
//因为head节点不能动,所以我们需要一个辅助遍历temp,从头开始遍历
HeroNode temp=head;
//遍历链表,找到最后
while(true){
//如果链表为空,表明已经找到了最后
if(temp.next==null){
break;
}
//如果没有找到最后,就将temp后移
temp=temp.next;
}
//当退出while循环时,temp就指向链表的最后,将最后这个节点的next执行那个新的节点heroNode
temp.next=heroNode;
}
//显示链表,遍历
public void list(){
//判断链表是否为空
if(head.next==null){
System.out.println("链表为空!");
return;
}
//因为头节点不能动,所以我们需要一个辅助变量来遍历
HeroNode temp=head.next;
while(true){
//判断链表是否到最后
if(temp==null){
return;
}
//输出节点的信息,并将辅助变量后移
System.out.println(temp);
temp=temp.next;
}
}
}
//定义HeroNode,每一个HeroNode的对象,就是一个节点
class HeroNode{
public int no;//英雄编号
public String name;//英雄名字
public String nickname;//英雄昵称
public HeroNode next;//指向下一个节点
@Override
public String toString() {
return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";
}
//构造器,构造一个节点
public HeroNode(int no,String name,String nickname){
this.no=no;
this.name=name;
this.nickname=nickname;
//为了显示节点,重写toString方法
}
}
3.考虑编号顺序时,添加英雄分析
4.考虑编号顺序时,添加英雄代码
代码如下(示例):
public void addByOrder(HeroNode heroNode){
//1,首先找到新添加节点的位置,是通过辅助变量(指针),通过遍历来完成
//因为head节点不能动,所以我们需要一个辅助遍历temp,从头开始遍历
HeroNode temp=head;
//因为是单链表,所以我们找的temp是位于添加位置的前一个节点,否则插入不了
boolean flag=false;//flag标志添加的编号是否存在,默认为false
//while循环来进行遍历,找到新添加节点的位置
while(true){
if(temp.next==null){
//说明temp已经在链表的最后
break;
}
if(temp.next.no>heroNode.no){
//位置找到,就在temp的后面插入
//该值小于temp.next.no,说明该值就在temp和temp.next之间,直接插入到它们之间即可
break;
}else if(temp.next.no==heroNode.no){
//说明希望添加的heroNode的编号已经存在了
flag = true;//说明编号存在
break;
}
//将temp后移,遍历当前链表,继续找看是否有符合上述条件的
temp=temp.next;
}
//判断flag的值
if(flag){
//不能添加,说明编号存在
System.out.printf("准备插入的英雄的编号%d已经存在了,不能加入\n",heroNode.no);
}else{
//2.插入到链表中, temp 的后面,将该编号插入到temp和temp.next之间
heroNode.next=temp.next;
temp.next=heroNode;
}
}
5.单链表的修改
修改节点的信息,根据no编号来修改,即no编号不能改,no编号改相当于添加数据
1.找到需要修改的节点,根据no编号
2,根据newHeroNode的no来修改即可
代码如下(示例):
public void update(HeroNode newHeroNode){
//判断是否为空
if(head.next==null){
System.out.println("链表为空~");
}
//1.找到需要修改的节点,根据no编号
//定义一个辅助变量
HeroNode temp=head.next;
boolean flag=false;//表示是否找到该节点