JAVA数据结构单链表

单链表

单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
这里以对单链表举例,通过添加人物到链表中,并可以对链表中的数据进行增删改查的相关操作。
添加链表时有两种方式,第一种方式是直接将人物添加到链表的尾部,并不对其顺序进行判断。
第二种方式是通过添加人物的编号值按照升序的方式进行插入,
删除数据时,通过提供对应的人物编号即可删除。
对数据进行修改则需要传入新的节点对象,并且编号值不要动,因为遍历时是根据编号的值进行判断的。

package linkedList;
// 单链表--带头结点
public class SingleLinkedList {
  public static void main(String[] args) {
      SingList singList = new SingList();
      HeroNode heroNode1 = new HeroNode(1,"张飞","黑脸");
      HeroNode heroNode2 = new HeroNode(2,"松江","及时雨");
      HeroNode heroNode3 = new HeroNode(5,"张飞","黑脸");
      HeroNode heroNode4 = new HeroNode(3,"松江","及时雨");
      HeroNode heroNode5 = new HeroNode(4,"张飞","黑脸");
      HeroNode heroNode6 = new HeroNode(6,"松江","及时雨");
      singList.add(heroNode1);
      singList.add(heroNode2);
      singList.addOrderBy(heroNode3);
      singList.addOrderBy(heroNode4);
      singList.addOrderBy(heroNode5);
      singList.addOrderBy(heroNode6);
      HeroNode heroNode7 = new HeroNode(6,"卢俊义","玉麒麟");
      singList.update(heroNode7);
      singList.delete(1);
      singList.delete(5);
      singList.delete(6);

      singList.showList();
  }
}
// 创建SingList管理英雄
class SingList{
  // 创建头结点,不存放具体的数据,不要动
  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 addOrderBy(HeroNode heroNode){
      // 因为是单链表,因此找的temp是要添加节点的前一个节点
      HeroNode temp = head;
      boolean flag = false;  // 标志添加的编号是否存在,默认是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.printf("不能添加编号为%d,已经存在,添加失败\n",heroNode.no);
      }else {
          heroNode.next = temp.next;
          temp.next = heroNode;
      }

  }
  // 修改节点的信息
  // 根据newHeroNode的no来修改
  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;
      }
      if (flag) {
          temp.name = newHeroNode.name;
          temp.nickName = newHeroNode.nickName;
      }else {
          System.out.printf("没有找到编号为%d的节点",newHeroNode.no);
      }
  }
  // 删除节点
  public void delete(int no){
      if (head.next == null){
          System.out.println("链表为空");
          return;
      }
      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;
          System.out.printf("删除编号为%d的节点\n",no);
      }else {
          System.out.printf("没有找到编号为%d的节点\n",no);
      }
  }
  // 显示链表
  public void showList(){
      if (head.next == null){
          System.out.println("链表为空");
          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 hNo,String name,String nickName){
      this.no = hNo;
      this.name = name;
      this.nickName = nickName;
  }
  // 重写toString方法
  @Override
  public String toString(){
      return "HeroNode [no = "+no+" ,name = "+name+",nickName = "+nickName+"]";
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我爱RMB

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值