Java实现简单单链表,反转链表

//定义英雄对象,每个对象都是一个节点
class SuperHero{
    public int id;
    public String name;
    public String nickName;
    public SuperHero next;

    public SuperHero(int sid,String sname,String snickName){
        this.id=sid;
        this.name=sname;
        this.nickName=snickName;
    }

    @Override
    public String toString() {
        return "SuperHero{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", nickName='" + nickName + '\'' +
                '}';
    }
}

class SingleLinkedList{
    private SuperHero head=new SuperHero(0," "," ");


    //在链表的最后一个位置添加节点
    public void addHero(SuperHero superHero){
        SuperHero temp=head; //定义一个临时虚拟指针指向头节点
        //遍历链表 找到最后
        while (true){
            if (temp.next == null){
                break;
            }
            temp=temp.next; //移动指针 判断是否到达最后一个
        }
        temp.next=superHero;
    }

    //在链表指定位置插入一个节点  位置是在temp的后面
    public void addByOrder( SuperHero superHero){
        SuperHero temp=head;//因为头节点不能动  通过辅助指针帮助找到添加的位置
        boolean flag=false;
        while (true){
            if (temp.next==null){ //判断链表是否为空
                break;
            }
            if (temp.next == superHero){ //判断是否存在一样的数据
                flag=true;
                break;
            } else if (temp.next.id > superHero.id){ //位置找到,就在temp的后面
                break;
            }
            temp=temp.next; //
        }
        if (flag){
            System.out.println("插入的节点已存在 不可插入"+superHero.id);
        }else {
            //插入节点  在temp  和 temp.next 中间插入
            superHero.next=temp.next;
            temp.next=superHero;
        }
    }

    //修改节点的信息  编号不能修改
    public void update(SuperHero superHero){
        SuperHero temp = head.next;
        if (temp == null){
            System.out.println("链表为空");
        }
        boolean flag = false;
        //找到需要修改的节点
        while (true){
          if (temp == null){
              break;
          }
          if (temp.id == superHero.id){
              //找到
              flag = true;
              break;
          }
          temp=temp.next;
        }
        //根据flag判断是否找到要修改的节点
        if (flag){
            temp.name = superHero.name;
            temp.nickName = superHero.nickName;
        }else {
            System.out.println("找不到要修改的节点");
        }
    }

    //删除节点的方法
    public void deleteById(int id){
        SuperHero temp = head;
        boolean flag = false;
        while (true){
            if (temp.next == null){
                break;
            }
            if (id == temp.next.id){
                flag = true;
                break;
            }
            temp=temp.next;
        }
        if (flag){  //找到
            temp.next = temp.next.next;
        }
    }
    //遍历节点的方法
    public void list(){
        SuperHero temp=head;
        while (true){
            if (temp==null){
                return;
            }
            temp=temp.next; //要在输出语句前执行 因为temp初始指向头节点 为空
            System.out.println(temp);
        }
    }
}

public class SingleLinkedListDemo {

    public static void main(String[] args) {
        SuperHero her1=new SuperHero(1,"钢铁侠","有钱");
        SuperHero her2=new SuperHero(2,"绿巨人","无敌");
        SuperHero her3=new SuperHero(3,"奥特曼","迪迦");
        SuperHero her4=new SuperHero(4,"蜘蛛侠","蜘蛛");
        SuperHero her5=new SuperHero(5,"蜘蛛侠","蜘蛛");
        SuperHero her6=new SuperHero(6,"蜘蛛侠","蜘蛛");

        SingleLinkedList linkedList=new SingleLinkedList();
        linkedList.addByOrder(her1);
        linkedList.addByOrder(her3);
        linkedList.addByOrder(her2);
        linkedList.addByOrder(her6);
        linkedList.addByOrder(her4);
        linkedList.list();
//        System.out.println("修改后的链表");
        SuperHero superHero=new SuperHero(4,"wodiao","sdniahj");
        linkedList.update(superHero);
        linkedList.list();
        System.out.println("删除后的");
        linkedList.deleteById(5);
        linkedList.deleteById(2);
        linkedList.list();

    }
}



反转单链表的补充方法

 //反转链表
    public static void reversetList(SuperHero head){
        SuperHero temp = head.next;
        SuperHero next = null;  //临时节点用来保存原链表断开后的节点
        SuperHero reverseHead = new SuperHero(0," "," "); //定义一个临时头节点
      while (temp!=null){
          next =temp.next; //next用来保存节点信息
          temp.next = null;  //置空进来的节点的next(可省略)
          temp.next = reverseHead.next;//让next指向临时头节点的next
          reverseHead.next=null; //置空临时头节点的next(可省略)
          reverseHead.next = temp;//让临时头节点指向temp
          temp=next;//节点后移
      }
      head.next =reverseHead.next;
    }

猜你喜欢

转载自blog.csdn.net/qq_41556688/article/details/112689150