链表是以节点的方式存储的,每个节点包括date域和next域。date域用来记录数据,next域用来记录下一个节点的位置。今天我们来谈谈带头结点单链表的基本操作:
首先我们定义一个节点。为方便输出,我们重写toString方法
class HeroNode{
public int no; //表示编号
public String name; //表示名字
public String nickname; //表示昵称
HeroNode next; //表示指向下一个节点
//构造器
public HeroNode(String name, String nickname, int no) {
this.name = name;
this.nickname = nickname;
this.no = no;
}
@Override
public String toString() {
return "HeroNode{" +
"no=" + no +
", name='" + name + '\'' +
", nickname='" + nickname + '\'' +
'}';
}
}
单链表的增加操作
public void add(HeroNode heroNode){
//遍历链表找链表的末尾
//将最后一个节点的next域指向新的节点
//因为头节点不能动,因此我们需要一个辅助变量temp
HeroNode temp = head; //对象之间的赋值,意味着head和temp操作的是同一块空间
while(temp.next != null){
temp = temp.next; //同上,temp与temp.next操作同一块空间
}
temp.next = heroNode; //temp.next指向heroNode的空间
}
单链表的按顺序增加
//按照顺序来插入节点
//如果添加失败就提示
public void addByOrder(HeroNode heroNode){
HeroNode temp = head;
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.next;//向后移,遍历
}
if(flag == true){
System.out.printf("准备插入的英雄编号 %d 已经存在",heroNode.no);
}else{
heroNode.next = temp.next; //这里的顺序不能反
temp.next = heroNode;
}
}
单链表的打印操作
//显示链表(遍历)
public void list(){
//先判断链表是否为空
if(head.next == null){
System.out.println("链表为空");
return;
}
//因为头节点不能动,因此我们需要一个辅助变量temp
HeroNode temp = head;
while(true){
if(temp == null){
break;
}
System.out.println(temp.toString());
temp = temp.next;
}
}
单链表的修改操作
//修改节点的信息,即编号不能改
public void update(HeroNode newHeraNode){
//判断是否为空
if(head.next == null){
System.out.println("链表为空");
return;
}
//找到需要改变的节点,根据no编号
HeroNode temp = head;
boolean flag = false; //来表示是否找到该节点
while(true){
if(temp == null){
break; //链表已经遍历结束
}
if(temp.no == newHeraNode.no){
flag = true;
break;
}
temp = temp.next;
}
if(flag){
temp.name = newHeraNode.name;
temp.nickname = newHeraNode.nickname;
}else{
System.out.println("找不到对应节点");
}
}
单链表的删除操作
//删除节点
public void delete(int n){
if(head.next == null){
System.out.println("链表为空,无法删除");
return;
}
HeroNode temp = head;
boolean flag = false;
while(true){
if(temp.next.no == n){
flag = true;
break;
}
if(temp.next == null){
break;
}
temp = temp.next;
}
if(flag){
temp.next = temp.next.next;
}else{
System.out.println("找不到对应信息");
}
}