Java单链表的认识
(1)链表是以节点的方式来存储,是链式存储
(2)每个节点包含 data 域, next 域:指向下一个节点.
(3)如图:发现链表的各个节点不一定是连续存储.
(4)链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定
节点类的创建
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;
}
@Override
public String toString() {
return "HeroNode{" +
"no=" + no +
", name='" + name + '\'' +
", nickname='" + nickname + '\'' +
'}';
}
}
链表的插入
一.不按顺序存储
思路:创建一个辅助变量temp指向head节点,遍历节点直至找到最后一个节点,插入。
public void add(HeroNode heroNode){
//创建一个辅助变量
HeroNode temp=head;
//遍历链表找到最后
while (true){
if(temp.next==null){
break;
}
temp=temp.next;
}
temp.next=heroNode;
}
二.按顺序存储
思路:
1.是按照编号顺序存储,先创建一个flag用来记录编号是否已存在。
2.循环遍历找到链表中节点的编号比新节点编号大的节点,若找到编号相等的节点 (使flag=true),不插入。
3.插入节点
新节点.next=temp.next
temp.next=新节点
public void addByOrder(HeroNode heroNode){
HeroNode temp=head;
boolean flag=false;
while (true){
//判断是否为空
if(temp.next==null){
break;
}
if(temp.next.no>heroNode.no){//位置找到,就在temp的后面插入
break;
}else if(temp.next.no==heroNode.no){//说明希望添加的编号已存在
flag=true;
break;
}
temp=temp.next;
}
//判断flag的值
if(flag){
System.out.println("准备插入的编号"+heroNode.no+"已存在");
}else {
//插入到列表
heroNode.next=temp.next;
temp.next=heroNode;
}
}
链表的遍历
public void show(){
//链表为空
if(head.next==null){
return;
}
HeroNode temp=head.next;
while (true){
//判断是否到链表最后
if(temp==null){
break;
}
System.out.println(temp);
temp=temp.next;
}
}
链表的修改
思路:
1.是根据找到节点的编号进行修改的
2.传入一个节点(要修改的节点),用flag标识是否找到,找到了就把原来节点的属性替换成新传入节点的属性。
public void update(HeroNode newHeroNode){
//判断是否为空
if(head.next==null){
System.out.println("链表为空...");
return;
}
//定义一个辅助变量
HeroNode temp=head.next;
boolean flag=false;//表示是否找到该节点
while (true){
if(temp==null){//到链表的最后了
break;
}
if(temp.no==newHeroNode.no){
//找到了
flag=true;
break;
}
temp=temp.next;
}
//根据flag判断是否找到
if(flag){
temp.name=newHeroNode.name;
temp.nickname=newHeroNode.nickname;
}
else {
System.out.println("没有找到编号="+newHeroNode.no+"的节点");
}
}
链表的删除
思路:
1.要找到将要删除节点的前一个节点,用flag标识
2.当找到时:
public void delete(int no){
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.println("不存在编号"+no);
}
}
总结
以上就是今天要讲的内容,本文介绍了链表的增删查改,在删除,查找,修改节点时都要记得判断是否为空。在写代码时最好在纸上写好思路,就不会导致无从下手啦。