一.单链表

1.单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。

3.存储

A.基本数据类型

首先得有一个类表示链表,只有一个属性记录节点的头地址。

//链表类
class MyList{
Node head; }

接下来是节点类,属性是data,和next

class Node{
int data;//存储数据
Node next;//存储下一个几点对象的地址 }

其次是处理逻辑类:

public class LinkUtil {
    
    
    //只负责存储第一个
    MyList list = new MyList();
    //初始化链表对象,将其head存储第一个对象的地址
    void intiList(){
        list.head = null;
    }
    
    
    
    void add(int date){
        //创建一个节点
        Node node= new Node();
        //给节点两个属性赋值
        node.data = date;
        node.next = list.head;
        //将第一父个节点 对象地址赋值给链表对象的head
        list.head = node;
        
        
    }
    void delete(int data){
        //删除第一个节点对象
        if(list.head.data==data){
            list.head=list.head.next;
            return;
        }
        //第二种
        Node p=list.head;
        Node ppre = null;//ppre指向p的前一个节点
        while(p!=null){
            ppre = p;
            p=p.next;
            if(p.data==data){
                ppre.next=p.next;
                break;
            }
            
        }
        
        
        
    }
    //展示数据
    void showAllNode(){
        //p指向第一个节点对象
        Node p = list.head;         while(p!=null) {
            System.out.println(p.data);
            p = p.next;
        }
        
    }
    //修改数据
    void exchange(int data,int newData){
        Node p = list.head;
        while(p!=null){
            if(p.data==data){
                p.data = newData;
                break;
            }
            p = p.next;
        }
        /*if(p==null){
            System.out.println("修改的值不存在!");
        }*/
    }
}
测试界面:
package com.se.link; public class MyListTest {
    public static void main(String[] args) {
        LinkUtil l = new LinkUtil();
        l.intiList();
        l.add(3);
        l.add(4);
        l.add(5);
        l.add(31);
        l.add(41);
        l.add(51);
        //l.exchange(12, 331);
        //l.delete(3);
        l.showAllNode();
        
    } }

B.存储自定义对象

原理类似,在节点数据域存放的现在是对象的地址,拿到数据域有必要去转型。

package com.se.link;

public class ListStudent {

	//只负责存储第一个
MyList1 list = new MyList1();
//初始化链表对象,将其head存储第一个对象的地址
void intiList(){
list.head = null;
} void add(Student stu){
//创建一个节点
Node1 node= new Node1();
//给节点两个属性赋值
node.msg = stu;
node.next = list.head;
//将第一父个节点 对象地址赋值给链表对象的head
list.head = node; }
//按姓名删除
void delete(String name){
Node1 p=list.head;
//删除第一个节点对象
Student stu = p.msg;
if(name.equals(stu.getName())){
list.head=list.head.next;
return;
} //第二种删除非第一个节点 Node1 ppre = null;//ppre指向p的前一个节点
while(p!=null){
ppre = p;
p=p.next;
Student stu1 =p.msg;
if(name.equals(stu1.getName())){
ppre.next=p.next;
break;
} } }
//展示数据
void showAllNode(){
//p指向第一个节点对象
Node1 p = list.head;
while(p!=null) {
Student stu =p.msg;
System.out.println(stu.getName()+":"+stu.getAge());
p = p.next;
} }
// 修改姓名修改数据
void exchange(String name,String newName){
Node1 p = list.head;
while(p!=null){
Student stu =p.msg;
if(name.equals(stu.getName())){
stu.setName(newName);
break;
}
p = p.next;
}
if(p==null){
System.out.println("修改的名字不存在!");
}
}
} //节点类
class Node1{
Student msg;//存储数据
Node1 next;//存储下一个几点对象的地址 }
//链表类
class MyList1{
Node1 head; }
class Student{
String name;
int age;
public Student(){}
public Student(String name,int age){
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
} }
测试界面:
package com.se.link; public class ListStudentTest {
    public static void main(String[] args) {
        
        ListStudent stu = new ListStudent();
        stu.add(new Student("小明",18));
        stu.add(new Student("小刚",22));
        stu.add(new Student("小强",34));
        stu.add(new Student("老王",54));
        stu.exchange("小明", "李白");
        stu.delete("小刚");
        stu.showAllNode();
        
    } }
注意,增加节点主要是运用链表的头插法。

java基础之自定义单链表练习的更多相关文章

  1. java基础学习之单例设计模式学习

    最近狂补java基础的我重新学习了下单例,下面直接贴出代码,以作备忘 package com.darling.single; /** * 单例模式 * 单例即在内存中只存在该类的一个实例,要想实现这个 ...

  2. 用java简单的实现单链表的基本操作

    package com.tyxh.link; //节点类 public class Node { protected Node next; //指针域 protected int data;//数据域 ...

  3. java基础(7):自定义类、ArrayList集合

    1. 引用数据类型(类) 1.1 引用数据类型分类 提到引用数据类型(类),其实我们对它并不陌生,如使用过的Scanner类.Random类. 我们可以把类的类型为两种: 第一种,Java为我们提供好 ...

  4. JAVA基础_自定义泛型

    泛型的来源 在Java中,泛型借鉴了C++的模版函数,从而引入了泛型. C++泛型 int add(int x,int y){ return x + y; } float add(float x.fl ...

  5. 荐书在精不在多,推荐一份夯实Java基础的必备书单!

    文/黄小斜 转载请注明出处 head first Java 推荐指数:⭐️⭐️⭐️⭐️⭐️ 推荐理由: 说实话,这本书和其他的我Java类型书籍真的大不相同,它不会一本正经地去说技术概念和原理,而是通 ...

  6. java基础讲解01-----简单了解一下java

    2017-4-12(晚)  闲来无事,静静把自己了解的java,好好回忆一次.如果能帮助别人也好.会不断补充 java有关的书籍真的很多,我也不过多的介绍了. 1.什么是java 2.java的语言特 ...

  7. java基础复习-自定义注解4(结合JDBC技术,打造类表映射微框架)

    写在前面: 1.该框架为自己所写的第一个框架类产品,可能有着许多不足的地方,读者可以到评论区指出.同时,该微框架的源码也会开源至博客中,够后来的学习者借鉴.由于该框架逻辑结构稍些复杂,不可能花大量篇幅 ...

  8. java单链表常用操作

    总结提高,与君共勉 概述. 数据结构与算法亘古不变的主题,链表也是面试常考的问题,特别是手写代码常常出现,将从以下方面做个小结 [链表个数] [反转链表-循环] [反转链表-递归] [查找链表倒数第K ...

  9. Java数据结构--单链表

    #java学习经验总结------单链表的建立与结点的增删 在该链表结点有data数据,并且还有cpu,分给cpu随机的时间片,根据时间片大小进行结点data的排序 链表结点的建立 class Lin ...

随机推荐

  1. iOS开发之SceneKit框架--SCNCamera.h

    1.SCNCamera简介 被称为照相机或者摄像机,可以附加到节点以提供显示场景的角度.其实就是用户视角和人的眼睛一样. 2.相关API简介 初始化 //懒加载 + (instancetype)cam ...

  2. MDK 添加芯片支持 以STM32F103ZE为例

    问题说明: 新建mdk工程时第一步是选芯片(以STM32F103ZE为例),但是芯片没有的话需要自己手动添加,如图: 解决方法: 下载KEIL MDK5以后是没有安装device的,如果此时创建工程会 ...

  3. 2day:Python基础

    基础知识: 1.python文件的后缀名:.py 2 .Windows Python的执行方式:Python 解释器路径  py文件路径 例:C:\python3\python.exe d:\1.py ...

  4. springboot+springsecurity+thymeleaf

    来源:听秦疆老师的课笔记 springsecurity是一个权限管理框架,用来授权,认证,加密等等......类似的工具还有shiro 1.整合 我用的是springboot2.2.0版本,导入以下依 ...

  5. css实现截取文本

    .ellipsis{ max-width: 260px; // 自定义 overflow: hidden; text-overflow: ellipsis; white-space: nowrap; ...

  6. Python全栈开发:Mysql(二)

    视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. SELECT *FROM (SELEC ...

  7. Python全栈开发:模块

    模块,用一砣代码实现了某个功能的代码集合. 参考资源:http://www.cnblogs.com/alex3714/articles/5161349.html 类似于函数式编程和面向过程编程,函数式 ...

  8. [转]NuGet学习笔记(1) 初识NuGet及快速安装使用

    关于NuGet园子里已经有不少介绍及使用经验,本文仅作为自己研究学习NuGet一个记录. 初次认识NuGet是在去年把项目升级为MVC3的时候,当时看到工具菜单多一项Library Package M ...

  9. LoadRunner内部结构(1)

    LoadRunner内部结构(1) 根据http://www.wilsonmar.com/1loadrun.htm  翻译: LoadRunner内部结构 1,            被测系统是由驱动 ...

  10. day1-初识Python以及环境搭建

    ---恢复内容开始--- 为什么学习Python? 软件质量:python的可读性很强,易于理解,非常接近于人类的自然语言. 提高开发者效率:相当于C,C++和JAVA等编译/静态型语言,Python ...