单向链表的增删查改

链表(Linked List)

链表是有序的列表

链表是以节点的方式来存储,是链式存储

每个节点包含data域,next域;指向下一个节点

链表的各个节点不一定是连续存储

链表分带头节点的链表和没有头节点的链表,根据实际需求来确定

单链表的增删改查

package linkedlist;

import javax.swing.plaf.synth.SynthSeparatorUI;

public class SingleLinkedListDemo {
    public static void main(String[] args) {
        //进行测试
        HeroNode hero1 = new HeroNode(1,"宋江","及时雨");
        HeroNode hero2 = new HeroNode(2,"卢俊义","玉麒麟");
        HeroNode hero3 = new HeroNode(3,"吴用","智多星");
        HeroNode hero4 = new HeroNode(4,"林冲","豹子头");
        SingleLinkedList sl = new SingleLinkedList();
//      sl.add(hero1);
//      sl.add(hero2);
//      sl.add(hero3);
//      sl.add(hero4);
        sl.addByOrder(hero1);
        sl.addByOrder(hero2);
        sl.addByOrder(hero4);
        sl.addByOrder(hero3);
        sl.list();

//      HeroNode hn = new HeroNode(3,"小卢","玉麒麟~~");
//      sl.updata(hn);
        sl.del(3);
        sl.list();
    }
}
//创建SingleLinkedList 管理我们的英雄
class SingleLinkedList{
    //初始化头节点,头结点不要动,不存放具体的数据
    private HeroNode head = new HeroNode(0,"","");
    //添加节点到单向链表
    //当不考虑编号顺序时
    //找到当前链表的最后节点,将最后节点的next指向新的节点
    public void add(HeroNode heroNode) {
        //因为Head节点不能动,因此我们需要一个辅助遍历temp
        HeroNode temp = head;//temp为头指针,临时变量
        //通过遍历链表,找到最后一个节点
        //当循环结束之时,就是找到最后一个节点之日
        while(true) {
            if(temp.next==null) {//第一次调用add时temp.next等于null终止循环
                break;//为null就跳出while循环
            }
            //如果没有找到最后,让temp往后移动,直到找到null为止
            temp=temp.next;//存储传递进来的heroNode节点temp
        }
        //当退出while循环时,temp就指向链表最后
        temp.next=heroNode;//跳出循环后,将传递进来的heroNode节点赋值给临时变量temp

    }

    //第二种方式在添加英雄时,根据排名奖英雄插入到指定位置
    public void addByOrder(HeroNode heroNode) {
        HeroNode temp = head;
        boolean flag = false;
        while(true) {
            if(temp.next == null){//第二次添加英雄,不为null
                break;
            }
            //假设一开始添加的第一个英雄宋江的编号为1,第二次添加的英雄编号为2,则1>2不成立,则执行temp = temp.next;

            if(temp.next.no>heroNode.no) {
                break;
            }else if(temp.next.no == heroNode.no) {
                flag = true;
                break;
            }
            //把1,宋江,及时雨,null 赋值给temp,这个时候再次执行循环,temp.next为null,
            temp = temp.next;
        }

        if(flag) {
            System.out.println(heroNode.no+"号已经存在");
        }else {
            heroNode.next = temp.next;//当第一次添加英雄时,把null赋值给节点heroNode的属性next
            temp.next = heroNode;//当第一次添加英雄时,把heroNode节点添加到temp类的属性next中去

        }

    }

    //修改节点的信息,根据no编号来修改
    public void updata(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;
            }
            System.out.println(temp.next+"测试");
            temp = temp.next;
        }
        if(flag) {
            temp.name = newHeroNode.name;
            temp.nickname=newHeroNode.nickname;
        }else {
            System.out.println("没有找到该编号");
        }
    }

    //删除节点
    public void del(int no) {
        HeroNode temp = head;
        boolean flag = false;//标志是否找要删除的节点
        while(true) {
            if(temp.next == null) {
                break;
            }
            if(temp.next.no == no) {
                flag = true;
                break;
            }
            System.out.println(temp.next+"测试");//宋江
            temp = temp.next;
            System.out.println(temp.next+"测试");//卢俊义
        }
        if(flag) {
            temp.next = temp.next.next;
        }else {
            System.out.println("要删除的节点不存在");
        }
    }
    //显示链表
    public void list() {
        //判断链表是否为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;//指针后移
        }
    }
}
//定义HeroNode,每个HeroNode 对象就是一个节点
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 + "]";
    }

}
//这玩意真废脑子

原文地址:https://www.cnblogs.com/train99999/p/11105296.html

时间: 2024-08-08 14:44:41

单向链表的增删查改的相关文章

单链表的增删查改等基本操作C++实现

单链表的初始化.增删查改.遍历一次找中间结点.删除一个无头单链表的非尾结点(不给头结点) #include<stdio.h> #include<stdlib.h> #include<malloc.h> typedef int DataType; typedef struct ListNode { struct ListNode* _next; DataType _data; }ListNode; void InitList(ListNode* &pHead) {

[原创]用C++类实现单向链表的增删查和反转操作

数据结构这东西,理解起来不算难,但是实现难度就不小了,虽然思路很清晰,但不知道从何下手还有语言的细节问题一直是阻碍初学者的主要障碍(比如我).今天用了一下午时间终于独立完成了链表操作. 找网上的代码,大多用了结构体,还有些并不适合刚学c++或者数据结构的人看,于是我是用类写的,代码比较符合学生的习惯和水平. 先看类定义 class node { public: int data; node *next; }; class linklist { node *h; ……//一些函数 } 两个类,no

C语言链表的增删查改

小经验:在VS2017中,使用while(scanf(“%d”,&i)!= NULL){......}时,结束输入需要输入三次ctrl+z+空格 func.h #include <stdlib.h> #include <string.h> typedef struct student { int number; struct student* pnext; }stu, *pstu; void list_print(pstu);//打印 void list_head_inse

c++单链表【构造函数、运算符重载、析构函数、增删查改等】

c++中的单向链表写法:实现增删查改.构造函数.运算符重载.析构函数等. 建立头文件SList.h #pragma once typedef int DataType; //SList要访问SListNode,可以通过友元函数实现,友元函数在被访问的类中 class SListNode { friend class SList;//友元函数 public: SListNode(const DataType x) :_data(x) , _next(NULL) {} private: SListN

c++双链表【构造函数、运算符重载、析构函数、增删查改及逆置等】

c++中的双向链表写法,主要实现(增删查改,链表逆置,构造函数,运算符重载,等) 建立头文件SList.h #pragma once typedef int DataType; class ListNode { friend class List;//友元函数 public: ListNode(const DataType x) :_data(x) , _prev(NULL) , _next(NULL) {} private: DataType _data; ListNode* _prev; L

c++中的顺序表写法,主要实现(增删查改,构造函数,运算符重载)

本文的内容主要是,利用c++写出顺序表,并对写出的代码进行测试, 主要实现的功能:实现对顺序表的增删查改, 要写的函数:构造函数,赋值运算符重载,析构函数.在编写代码过程中应注意到深浅拷贝问题. 下面是顺序表的类函数: #pragma once #include<iostream> using namespace std; typedef int DataType; class SeqList { public: SeqList(); SeqList(DataType *array, size

php mysql增删查改

php mysql增删查改代码段 $conn=mysql_connect('localhost','root','root');  //连接数据库代码 mysql_query("set names utf8");  //传输编码 mysql_query('sql'$conn); //查找名为sql的数据库 admin为表名: 查找数据代码段: $sql="select * from admin ";  //查询表: $sql="select  * from

mysql基础知识之增删查改使用介绍

 mysql基础知识之增删查改使用介绍 本文主要介绍mysql常用的SELECT.INSERT.UPDATE.DELETE语句的使用,数据库的安装这里不做介绍,并且事先已经准备好相关数据. 本文中使用的student表中的数据如下: mysql> SELECT * FROM student; 一.SELECT语句的使用 1.单表查询 语法格式: SELECT culom1,culom2,culom3 FROM TABLE_NAME; 可以改变字段显示顺序 2.WHERE子句查询 语法格式: SE

nodejs连接mysql并进行简单的增删查改

最近在入门nodejs,正好学习到了如何使用nodejs进行数据库的连接,觉得比较重要,便写一下随笔,简单地记录一下 使用在安装好node之后,我们可以使用npm命令,在项目的根目录,安装nodejs中的mysql模块 npm install mysql 在连接数据库之前,要先引入nodejs连接处理mysql的模块 var mysql = require('mysql'); 类似php连接mysql的方式,编写连接代码 //使用nodejs处理mysql的模块,使用创建连接方法,创建与mysq