单链表增删改详解

2年前 (2020-01-12) 431次浏览 已收录 7个评论

数据域和指针域构成单链表的基本结构, 而数据域用来存放数据, 指针域用来存放指向下一个结点

单链表的头结点不存放任何数据, 它的作用就是表示单链表的头, 尾结点的特征是他的next指向null

不过, 这只是逻辑结构, 真正在内存中位置可能是这样

1 、单链表添加元素

上面这个是有序的做法,下面的是无序的做法

2 、单链表的删除元素

3、单链表的修改

通过遍历 , 找到所在位置进行修改数据

具体代码如下

package 链表;

public class 单向链表 {
public static void main(String[] args) {
 HeroNode hero1=new HeroNode(1, "小明", "计算机");
 HeroNode hero2=new HeroNode(2, "小红", "算法");
 HeroNode hero3=new HeroNode(3, "小张", "剪辑");
 SingleLinkedList sin=new SingleLinkedList();
 sin.add2(hero1);
 sin.add2(hero3);
 sin.add2(hero2);
 sin.list();
 HeroNode hero4=new HeroNode(3, "小张张", "爬虫");
 sin.updata(hero4);
 System.out.println("修改后*****************************************");
 sin.list();
 System.out.println("删除后*****************************************");
 sin.del(1);
 sin.list();
}
}
class SingleLinkedList{
 private HeroNode head=new HeroNode(0, "", "");
 public void add(HeroNode heroNode) {//无序
  HeroNode temp=head;//通过临时变量进行指向,防止链表混乱
  while(true) {
  if(temp.next==null) {
   break;
  }
  temp=temp.next;
 }
  temp.next=heroNode;//无序的添加, 直接在后边添加
}
 public void add2(HeroNode heroNode) {//有序
  HeroNode temp=head;
  boolean flag=false;//相等的编号不允许添加
  while(true) {
   if(temp.next==null)//头结点指向为空
    break;
   if(temp.next.no>heroNode.no) {
   //如果遇到比添加的数据要大,就退出,说明在他前面添加可能就是有序的了
    break;
   }
   else if(temp.next.no == heroNode.no) {
    //如果编号相等,就不能添加了,因为这是有序的
    flag=true;
    break;
   }
   temp=temp.next;//继续找下一个结点 #添加位置
  }
  if(flag) {//已经存在的编号不允许添加
   System.out.println("已存在");
  }else {//要添加的数据 指向 找到添加位置的下一个结点
   heroNode.next=temp.next;
   temp.next=heroNode;//起初的指向要改变成指向要添加的数据
  }
 }
 public void del(int no) {
  HeroNode temp4=head;
  boolean flag4=false;
  while(true) {
   if(temp4.next==null) {
    break;
   }
   if(temp4.next.no==no) {
    //下一个结点指向要删除的结点的编号
    flag4=true;
    break;
   }			
   temp4=temp4.next;
  }
  if(flag4) {
   //让他指向要删除的结点的下一个结点, 中间的结点没有被引用,会被垃圾回收
   temp4.next=temp4.next.next;		
  }
  else {
   System.out.println("不存在");
  }
 }
 public void updata(HeroNode heroNode) {
  HeroNode temp3=head;
  boolean flag3=false;
  while(true) {
   if(temp3.no==heroNode.no)
    flag3=true;
   if(temp3.next==null)
    break;
   temp3=temp3.next;
  }
  if(flag3) {
   temp3.name=heroNode.name;
   temp3.nickname=heroNode.nickname;
  }else {
   System.out.println("不存在");
  }
 }
 public void list() {
  if(head.next==null) {
   return;
  }
  HeroNode temp=head.next;
  while(true) {
   if(temp==null) {
    break;
   }
   System.out.println(temp);
   temp=temp.next;
  }
 }
}
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 + "]";
 }
}

 


渣渣龙, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:单链表增删改详解
喜欢 (0)

您必须 登录 才能发表评论!

(7)个小伙伴在吐槽
  1. 我给你点赞了
    2020-03-27 12:58
  2. 记住这个网站了
    2020-03-27 14:14
  3. 我也是小白以后多多交流
    2020-03-28 17:30
  4. 我加你了哦
    2020-05-26 09:17
  5. 记住这个网站了
    2020-05-26 09:44
  6. 挺明白的
    2020-05-26 10:09
  7. 我也是小白以后多多交流
    2020-05-26 10:31