IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 单链表简单的增删改查 -> 正文阅读

[数据结构与算法]单链表简单的增删改查

1)链表是以节点的方式来存储,是链式存储
2)每个节点包含 data域,next域:指向下一个节点.
3)如图: 发现链表的各个节点不一定是连续存储.
4)链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定
在这里插入图片描述

思路分析:
添加(创建)
1.先创建- -个head头节点,作用就是表示单链表的头
2.后面我们每添加一-个节点,就直接加入到链表的最后遍历:

代码实现:(按添加顺序排序)

package com.main.dataStructures;

public class SingleLinkedListDemo {
    public static void main(String[] args) {
        HeroNode hero1 = new HeroNode(1,"wp","pp");
        HeroNode hero2 = new HeroNode(2,"lmx","dg");
        HeroNode hero3 = new HeroNode(3,"bb","ss");
        SingleLinkedList list = new SingleLinkedList();
        list.addNode(hero1);
        list.addNode(hero2);
        list.addNode(hero3);
        list.showNode();

    }
}


class SingleLinkedList{
    private HeroNode head = new HeroNode(0,"","");
    //添加
    public void addNode(HeroNode node){
        HeroNode temp = head;
        while (true){
            //判满
            if (temp.next == null){
                break;
            }
            //后移
            temp = temp.next;
        }
        //添加
        temp.next = node;
    }

    //显示
    public void showNode(){
        //判空
        if (head.next==null){
            System.out.println("链表为空");
        }
        //不能动头,定辅变量
        HeroNode temp = head.next;
        while (true){
            //判断是否到链表最后
            if (temp==null){
                break;
            }
            System.out.println(temp);
            //后移
            temp = temp.next;
        }
    }
}
class HeroNode{
    int no;
    String name;
    String nickName;
    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 + '}';
    }
}

思路分析:
1.首先找到新添加的节点的位置,是通过辅助变量(指针),通过遍历来搞定
2.新的节点.next=temp.next
3.将temp.next=新的节点

代码实现:(按编号排序)

package com.main.dataStructures;

public class SingleLinkedListDemo {
    public static void main(String[] args) {
        HeroNode hero1 = new HeroNode(1,"wp1","pp");
        HeroNode hero2 = new HeroNode(2,"lmx2","dg");
        HeroNode hero3 = new HeroNode(3,"wp3","ss");
        HeroNode hero4 = new HeroNode(4,"wp4","qq");
        HeroNode hero5 = new HeroNode(5,"wp5","ww");
        HeroNode hero6 = new HeroNode(6,"wp6","aa");
        SingleLinkedList list = new SingleLinkedList();
        list.addNode2(hero5);
        list.addNode2(hero1);
        list.addNode2(hero6);
        list.addNode2(hero2);
        list.addNode2(hero4);
        list.addNode2(hero3);
        list.showNode();

    }
}


class SingleLinkedList{
    private HeroNode head = new HeroNode(0,"","");
    //按添加顺序添加
    public void addNode(HeroNode node){
        HeroNode temp = head;
        while (true){
            //判满
            if (temp.next == null){
                break;
            }
            //后移
            temp = temp.next;
        }
        //添加
        temp.next = node;
    }
    //按编号排序添加
    public void addNode2(HeroNode node){
        HeroNode temp = head;
        boolean flag = false;
        while (true){
            //判满:temp已经是链表最后一个元素了,无法添加

            if (temp.next == null){
                break;
            }
            if (temp.next.no>node.no){
                break;
            }else if (temp.next.no==node.no){
                flag = true;
                break;
            }
            //后移
            temp = temp.next;
        }
        //添加
        if (flag){
            System.out.println("编号已存在");
        }else {
            node.next = temp.next;
            temp.next = node;
        }
    }

    //显示
    public void showNode(){
        //判空:头节点的next等于null;说明该链表只有一个头节点,没有其他数据
        if (head.next==null){
            System.out.println("链表为空");
        }
        //不能动头,定辅变量
        HeroNode temp = head.next;
        while (true){
            //判断是否到链表最后
            if (temp==null){
                break;
            }
            System.out.println(temp);
            //后移
            temp = temp.next;
        }
    }
}
class HeroNode{
    int no;
    String name;
    String nickName;
    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 + '}';
    }
}

修改:
根据编号找到此人,然后将其除编号外其他对应信息修改即可

package com.main.dataStructures;

public class SingleLinkedListDemo {
    public static void main(String[] args) {
        HeroNode hero1 = new HeroNode(1,"wp1","pp");
        HeroNode hero2 = new HeroNode(2,"lmx2","dg");
        HeroNode hero3 = new HeroNode(3,"wp3","ss");
        HeroNode hero4 = new HeroNode(4,"wp4","qq");
        HeroNode hero5 = new HeroNode(5,"wp5","ww");
        HeroNode hero6 = new HeroNode(6,"lmx6","asb");
        HeroNode hero7 = new HeroNode(6,"lmxcbb","a23");
        SingleLinkedList list = new SingleLinkedList();
        list.addNode2(hero5);
        list.addNode2(hero1);
        list.addNode2(hero6);
        list.addNode2(hero2);
        list.addNode2(hero4);
        list.addNode2(hero3);

        list.showNode();
        System.out.println("修改后的情况:~~");
        list.updateNode(hero7);
        list.showNode();

    }
}


class SingleLinkedList{
    private HeroNode head = new HeroNode(0,"","");
    //按添加顺序添加
    public void addNode(HeroNode node){
        HeroNode temp = head;
        while (true){
            //判满
            if (temp.next == null){
                break;
            }
            //后移
            temp = temp.next;
        }
        //添加
        temp.next = node;
    }
    //按编号排序添加
    public void addNode2(HeroNode node){
        HeroNode temp = head;
        boolean flag = false;
        while (true){
            //判满:temp已经是链表最后一个元素了,无法添加
            if (temp.next == null){
                break;
            }
            if (temp.next.no>node.no){
                break;
            }else if (temp.next.no==node.no){
                flag = true;
                break;
            }
            //后移
            temp = temp.next;
        }
        //添加
        if (flag){
            System.out.println("编号已存在");
        }else {
            node.next = temp.next;
            temp.next = node;
        }
    }
    //修改
    //根据编号修改除编号外的其他数据
    public void updateNode(HeroNode newNode){
        HeroNode temp = head.next;
        boolean flag = false;
        while (true){
            if (temp == null){
                break;//已经遍历到最后了
            }
            if (temp.no == newNode.no){
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag){
            temp.name = newNode.name;
            temp.nickName = newNode.nickName;
        }else {
            System.out.println("没有该用户");
        }

    }

    //显示
    public void showNode(){
        //判空:头节点的next等于null;说明该链表只有一个头节点,没有其他数据
        if (head.next==null){
            System.out.println("链表为空");
        }
        //不能动头,定辅变量
        HeroNode temp = head.next;
        while (true){
            //判断是否到链表最后
            if (temp==null){
                break;
            }
            System.out.println(temp);
            //后移
            temp = temp.next;
        }
    }
}
class HeroNode{
    int no;
    String name;
    String nickName;
    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 + '}';
    }
}

删除操作:
从单链表中删除一一个节点的思路分析:
1.我们先找到需要删除的这个节点的前一-个节点temp
2. temp.next = temp.next.next
3.被删除的节点,将不会有其它引用指向,会被垃圾回收机制回收

package com.main.dataStructures;

public class SingleLinkedListDemo {
    public static void main(String[] args) {
        HeroNode hero1 = new HeroNode(1,"wp1","pp");
        HeroNode hero2 = new HeroNode(2,"lmx2","dg");
        HeroNode hero3 = new HeroNode(3,"wp3","ss");
        HeroNode hero4 = new HeroNode(4,"wp4","qq");
        HeroNode hero5 = new HeroNode(5,"wp5","ww");
        HeroNode hero6 = new HeroNode(6,"lmx6","asb");
        HeroNode hero7 = new HeroNode(6,"lmxcbb","a23");
        SingleLinkedList list = new SingleLinkedList();
        list.addNode2(hero5);
        list.addNode2(hero1);
        list.addNode2(hero6);
        list.addNode2(hero2);
        list.addNode2(hero4);
        list.addNode2(hero3);
        list.showNode();
        System.out.println("修改后的情况:~~");
        list.updateNode(hero7);
        list.deleteNode(1);
        list.deleteNode(3);
        list.deleteNode(5);
        list.showNode();

    }
}


class SingleLinkedList{
    private HeroNode head = new HeroNode(0,"","");
    //按添加顺序添加
    public void addNode(HeroNode node){
        HeroNode temp = head;
        while (true){
            //判满
            if (temp.next == null){
                break;
            }
            //后移
            temp = temp.next;
        }
        //添加
        temp.next = node;
    }
    //按编号排序添加
    public void addNode2(HeroNode node){
        HeroNode temp = head;
        boolean flag = false;
        while (true){
            //判满:temp已经是链表最后一个元素了,无法添加
            if (temp.next == null){
                break;
            }
            if (temp.next.no>node.no){
                break;
            }else if (temp.next.no==node.no){
                flag = true;
                break;
            }
            //后移
            temp = temp.next;
        }
        //添加
        if (flag){
            System.out.println("编号已存在");
        }else {
            node.next = temp.next;
            temp.next = node;
        }
    }
    //修改
    //根据编号修改除编号外的其他数据
    public void updateNode(HeroNode newNode){
        HeroNode temp = head.next;
        boolean flag = false;
        while (true){
            if (temp == null){
                break;//已经遍历到最后了
            }
            if (temp.no == newNode.no){
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag){
            temp.name = newNode.name;
            temp.nickName = newNode.nickName;
        }else {
            System.out.println("没有该用户");
        }

    }
    //删除操作
    //思路
    //1. head不能动,因此我们需要-个temp辅助节点找到待删除节点的前一个节点
    //2.说明我们在比较时,是temp.next.no和需要删除的节点的no比较
    public void deleteNode(int no){
        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;
        }else {
            System.out.println("没有该用户");
        }

    }

    //显示
    public void showNode(){
        //判空:头节点的next等于null;说明该链表只有一个头节点,没有其他数据
        if (head.next==null){
            System.out.println("链表为空");
        }
        //不能动头,定辅变量
        HeroNode temp = head.next;
        while (true){
            //判断是否到链表最后
            if (temp==null){
                break;
            }
            System.out.println(temp);
            //后移
            temp = temp.next;
        }
    }
}
class HeroNode{
    int no;
    String name;
    String nickName;
    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 + '}';
    }
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-14 23:11:55  更:2021-07-14 23:14:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/8 7:37:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码