单链表增删改详解

首页 » 算法 » 单链表增删改详解

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

单链表增删改详解

单链表的头结点不存放任何数据, 它的作用就是表示单链表的头, 尾结点的特征是他的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 + "]";
 }
}

 

单链表增删改详解
分享到:
赞(0) 打赏

评论 7

评论前必须登录!

 

  1. #1

    我给你点赞了

    小白6个月前 (03-27)
  2. #2

    记住这个网站了

    我也是渣渣6个月前 (03-27)
  3. #3

    我也是小白以后多多交流

    奋斗6个月前 (03-28)
  4. #4

    我加你了哦

    中国加油小子4个月前 (05-26)
  5. #5

    记住这个网站了

    你好4个月前 (05-26)
  6. #6

    挺明白的

    小白4个月前 (05-26)
  7. #7

    我也是小白以后多多交流

    笨鸟先飞4个月前 (05-26)

觉得文章有用就打赏一下弟弟吧

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.5主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
正在播放:

作者想对您说:

累了就停下来听首歌吧

听完后会给您一个好心情

最后

等到您不容易

还希望您能多待一会儿

      00:00/00:00