单链表java的简单实现

单链表简单的实现(包括链表的增删查改)

package com.it.likedList;

import java.nio.charset.CharsetEncoder;

/**
 * @author Snail-Bo
 * @date 2020/3/27 13:48
 */
class SingleLinkedListDemo {
    public static void main(String[] args) {
        //测试
        UserNode user1 = new UserNode(1, "小王", "1233");
        UserNode user2 = new UserNode(2, "赵六", "2222");
        UserNode user3 = new UserNode(3, "王五", "333");
        SingleLinkedList sing = new SingleLinkedList();

        /*System.out.println("不顺序插入");
        sing.add(user2);
        sing.add(user1);
        sing.add(user3);
        sing.list();*/
        System.out.println(" 根据id顺序的插入");
        sing.addByid(user2);
        sing.addByid(user1);
        sing.addByid(user3);
        sing.list();
        System.out.println("进行删除操作");
        //sing.delete(3);
        sing.delete(1);
        //sing.delete(2);
        sing.list();

        System.out.println("进行修改操作");
        UserNode user4 = new UserNode(3, "刘大头", "4333");
        sing.updateNode(user4);
        sing.list();
    }
}

class SingleLinkedList{
     //初始化一个头节点 ,一般是定义不变的,不放具体的数据
    private UserNode head = new UserNode(0,"","0");

    //添加用户节点
    public void add(UserNode userNode){
        //头节点不能动,使用辅助的节点进行扫描,遍历
        UserNode temp = head;
        //遍历链表,找到最后面的那个节点,来进行添加节点
        while (temp.next!=null){
            temp = temp.next; //temp进行后移
        }
        temp.next=userNode; //将要新添加的节点,添加到最后的节点上
    }

    //根据id的顺序进行节点的添加
    public void addByid(UserNode userNode){
        UserNode temp = head;
        boolean flag = false; //判断是否找有相同的节点
        while (true){
            if(temp.next==null){  //说明该temp就在链表的最后
                break;
            }
            if(temp.next.getId()>userNode.getId()){
                break;  //找到了插入的节点位置
            }
            if(temp.next.getId()==userNode.getId()){
                flag=true ;//编号已存在
                break;
            }
            temp = temp.next;
        }
        if (flag){
            System.out.println("编号已存在,不能添加");
        }else {
            //将需要插入的节点添加到链表中
            userNode.next=temp.next;    //先将temp后面的那个节点和插入节点连接起来
            temp.next=userNode;         //再将temp和新插入的节点连接
        }
    }

    /**
     * 根据id来进行修改节点
     * @param userNode
     */
    public void  updateNode(UserNode userNode){
        UserNode temp = head;
        boolean flag = false;
        while (true){
            if(temp.getId()==userNode.getId()){
                flag=true; //表示找到了要修改的id 的节点
                break;
            }
            temp=temp.next;
        }
        if (flag){
            temp.setName(userNode.getName()); //进行赋值
            temp.setNum(userNode.getNum());
        }else {
            System.out.println("没有找到该节点");
        }
    }

    /**
     * 根据id删除节点
     * @param id
     */
    public void delete(int id){
        UserNode temp = head;   //使用辅助节点进行扫描
        boolean flag = false;  //判断是否找到要删除的节点的id
        while(true){
            if(temp.next==null){
                break;
            }
            if(temp.next.getId()==id){          //通过temp节点的next找到要删除节点,(即为temp后面的那个节点就为要删除的节点)
                flag = true;
                break;
            }
            temp = temp.next;  //进行后移,遍历
        }
        if (true){
            temp.next=temp.next.next;  //将temp后面的节点直接跳过后一个节点 ,连接到 后面的后面的节点,即可实现删除找到的该节点
        }else {
            System.out.println("没有找到这个节点");
        }
    }

    //显示所有的链表(遍历)
    public void list(){
        //首先进行判断链表是否为空
        if (head.next==null){
            System.out.println("链表为空");
            return;
        }

        UserNode temp = head.next;
        //遍历head后面的节点 ,进行打印输出
        while (temp!=null){
            System.out.println(temp);
            temp = temp.next;   //将temp 进行后移
        }
    }

}


//定义用户的对象  即为每一个节点
class UserNode{
    private int id;     //用户的编号
    private String name;    //用户的姓名
    private String num;   //用户的号码
    UserNode next; // 指向下一个用户

    //构造器
    public UserNode(int id, String name, String num) {
        this.id = id;
        this.name = name;
        this.num = num;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getNum() {
        return num;
    }

    public void setNum(String num) {
        this.num = num;
    }

    public UserNode getNext() {
        return next;
    }

    public void setNext(UserNode next) {
        this.next = next;
    }

    @Override
    public String toString() {
        return "UserNode{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", num='" + num + '\'' +
                ", next=" + next +
                '}';
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值