java基础之自定义单链表练习
一.单链表
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基础之自定义单链表练习的更多相关文章
- java基础学习之单例设计模式学习
最近狂补java基础的我重新学习了下单例,下面直接贴出代码,以作备忘 package com.darling.single; /** * 单例模式 * 单例即在内存中只存在该类的一个实例,要想实现这个 ...
- 用java简单的实现单链表的基本操作
package com.tyxh.link; //节点类 public class Node { protected Node next; //指针域 protected int data;//数据域 ...
- java基础(7):自定义类、ArrayList集合
1. 引用数据类型(类) 1.1 引用数据类型分类 提到引用数据类型(类),其实我们对它并不陌生,如使用过的Scanner类.Random类. 我们可以把类的类型为两种: 第一种,Java为我们提供好 ...
- JAVA基础_自定义泛型
泛型的来源 在Java中,泛型借鉴了C++的模版函数,从而引入了泛型. C++泛型 int add(int x,int y){ return x + y; } float add(float x.fl ...
- 荐书在精不在多,推荐一份夯实Java基础的必备书单!
文/黄小斜 转载请注明出处 head first Java 推荐指数:⭐️⭐️⭐️⭐️⭐️ 推荐理由: 说实话,这本书和其他的我Java类型书籍真的大不相同,它不会一本正经地去说技术概念和原理,而是通 ...
- java基础讲解01-----简单了解一下java
2017-4-12(晚) 闲来无事,静静把自己了解的java,好好回忆一次.如果能帮助别人也好.会不断补充 java有关的书籍真的很多,我也不过多的介绍了. 1.什么是java 2.java的语言特 ...
- java基础复习-自定义注解4(结合JDBC技术,打造类表映射微框架)
写在前面: 1.该框架为自己所写的第一个框架类产品,可能有着许多不足的地方,读者可以到评论区指出.同时,该微框架的源码也会开源至博客中,够后来的学习者借鉴.由于该框架逻辑结构稍些复杂,不可能花大量篇幅 ...
- java单链表常用操作
总结提高,与君共勉 概述. 数据结构与算法亘古不变的主题,链表也是面试常考的问题,特别是手写代码常常出现,将从以下方面做个小结 [链表个数] [反转链表-循环] [反转链表-递归] [查找链表倒数第K ...
- Java数据结构--单链表
#java学习经验总结------单链表的建立与结点的增删 在该链表结点有data数据,并且还有cpu,分给cpu随机的时间片,根据时间片大小进行结点data的排序 链表结点的建立 class Lin ...
随机推荐
- 海量数据解决思路之Hash算法
海量数据解决思路之Hash算法 一.概述 本文将粗略讲述一下Hash算法的概念特性,里边会结合 分布式系统负载均衡 实例对Hash的一致性做深入探讨.另外,探讨一下Hash算法在海量数据处理方案中 ...
- MDK(KEIL)使用Astyle格式化代码
关于Astyle Astyle 的全称是Artistic Style的简称,是一个开源的源代码格式化工具,可以对C,C++,C#以及Java等编程语言的源代码进行缩进.格式化.美化. Home Pag ...
- 4_8.springboot2.x嵌入式servlet容器启动原理解析
问题描述: 什么时候创建嵌入式的Servlet容器工厂? 什么时候获取嵌入式的Servlet容器并启动Tomcat? *获取嵌入式的Servlet容器工厂: 1).SpringBoot应用启动运行ru ...
- POJ 2932 平面扫描 /// 判断圆的包含关系
题目大意: 平面上有n个两两不相交的圆,给定圆的圆心(x,y)和半径 r 求所有最外层的 即 不包含于其他圆内部的圆 挑战258页 平面扫描 记录所有圆的左端和右端 排序后 逐一扫描 将到当前圆为止的 ...
- java_缓冲流(字符输出流)
/** 字符缓冲流: * java.io.BufferedWriter extends writer * BufferedWriter:字符缓冲输出流: * * 构造方法: * BufferedWri ...
- 集合遍历remove时ConcurrentModificationException异常
1.集合遍历时候,有时候需要remove或add操作,这时候遍历方式可能会影响程序运行 例如: @Test public void test1() { List<Integer> intL ...
- Python-网络编程之粘包、UDP
目录 粘包问题 subprocess模块 struct模块 UDP协议编程 简易qq聊天室 粘包问题 什么是粘包问题呢? 在我们写 tcp socket编程的时候,tcp协议是一个流式的协议,服务端第 ...
- 关于新手必须要理解的几个名词,cookie、session和token
以下要说的,虽然不是开发过程中必须会遇到的,但却是进阶之路上必须要掌握的,一些涉及到状态管理与安全的应用当中尤为重要. 我之前虽略有学习,但也是东拼西凑临时看的一点皮毛,所以在这个假期利用一点时间,整 ...
- escape encodeURI和encodeURIComponent的区别
escape(与之对应->unescape) escape是对字符串(string)进行编码(而另外两种是对URL),作用是让它们在所有电脑上可读.编码之后的效果是%XX或者%uXXXX这种形式 ...
- Mac 下搭建vue开发环境
tips:一定要有翻墙工具如lanter,另外要保证网速OK. 1. 首先需要安装homebrew liukingdeMBP:~ liuking$ /usr/bin/ruby -e "$(c ...