单链表:单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
自己手动写一个单链表:
首先,定义一个节点类:

package com.wei;

public class Link {
public int data;// 存放数据
public Link next;// 存放下一个节点 public Link(int data) {
this.data = data;
} public Link(int data, Link next) {
this.data = data;
this.next = next;
} public Link() {
} public void display() {
System.out.println(data + " ");
}
}

第二部分是定义一个链表类:

package com.wei;

public class LinkList {

    public Link frist;// 定义一个头节点
public Link last;//尾指针永远指向头节点
public int size = 0;// 节点的位置 public LinkList() {
this.frist = null;//
} /**
* 判断链表是否为空
*
* @return
*/
public boolean isis() {
return size == 0;
} /**
* 头插法
*
* @param data
*/
public void addfrist(int data) {
Link L = new Link(data);
L.next = frist;
frist = L;
size++;
} /**
* 尾插法
*
* @param data
*/
public void addlast(int data) { if (frist == null) {
frist = new Link(data);
last = frist;
} else {
Link newL = new Link(data);
last.next = newL;
last = newL;
}
size++;
} /**
* 从头删除
*
* @return
*/
public Link removefrist() {
Link d = frist;
frist = d.next;
size--;
return d;
} /**
* 删除最后一个
*/
public void dellast() {
Dell(size - 1);
} /**
* 获取链表长度
*/
public void displayAllLink() {
Link cure = frist;
while (cure != null) {
cure.display();
cure = cure.next;
}
System.out.println("长度" + size);
} /**
* 获取指定位置的节点元素
*
* @param index
* @return
*/
public Link getData(int index) {
if (index < 0 && index > size - 1) {
throw new IndexOutOfBoundsException("越界");
}
Link count = frist;
for (int i = 0; i < size && count != null; i++, count = count.next) {
if (i == index) {
return count;
}
}
return null;
} /**
* 按值查找指定位置
*
* @param element
* @return
*/
public int selectIndex(int element) {
Link current = frist;
for (int i = 0; i < size && current != null; i++, current = current.next) {
if (current.data == element) {
return i;
}
}
return -1;
} /**
* 删除链表中数值最大的元素
*/
public void delMax() {
// 要遍历的链表
Link cu = frist;
// 初始化一个节点,当中间变量
Link cc = new Link(0);
// 遍历
for (int i = 0; i < size && cu != null; i++, cu = cu.next) {
if (cu.data > cc.data) {
cc.data = cu.data;
}
}
int data = cc.data;
int number = selectIndex(data);
Dell(number);
} /**
* 删除链表中数值最小的元素
*/
public void delMin() {
// 要遍历的链表
Link cu = frist;
// 初始化一个节点,当中间变量
Link cc = new Link(0);
// 遍历
for (int i = 0; i < size && cu != null; i++, cu = cu.next) {
if (cu.data < cc.data) {
cc.data = cu.data;
}
}
int data = cc.data;
int number = selectIndex(data);
Dell(number);
} /**
* 从指定位置处插入数据
*
* @param t
* @param index
*/
public void insert(int t, int index) {
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException("索引超出线性表范围");
}
if (frist == null) {
addlast(t);
} else {
if (index == 0) {
addfrist(t);
} else {
Link k = getData(index - 1);
k.next = new Link(t, k.next);
size++;
} }
} /**
* 从指定位置处删除
*
* @param index
*/
public void Dell(int index) {
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException("索引超出线性表范围");
}
Link del = null;
if (index == 0) {
del = frist.next;
frist = frist.next;
} else {
Link neL = getData(index - 1);
del = neL.next;
neL.next = del.next;
del.next = null;
}
size--;
} /**
* 清空链表
*/
public void clear() {
frist = null;
last = null;
size = 0;
} /**
* 按从小到大排序
*/
public void Min_to_Max() {
// 要遍历的链表
Link cu = frist;
// 记录最小值
int min;
while (cu != null) {
// 内重循环从当前节点的下一个节点循环到尾节点,找到和外重循环的值比较最小的那个,然后与外重循环进行交换
Link nextLink = cu.next;
while (nextLink != null) {
// 比外循环小的值放在前面
if (nextLink.data < cu.data) {
min = nextLink.data;
nextLink.data = cu.data;
cu.data = min;
}
nextLink = nextLink.next;
}
cu = cu.next;
} } /**
* 按从大到大排序
*/
public void Max_to_Min() {
// 要遍历的链表
Link cu = frist;
// 记录最小值
int min;
while (cu != null) {
// 内重循环从当前节点的下一个节点循环到尾节点
//找到和外重循环的值比较最小的那个,然后与外重循环进行交换
Link nextLink = cu.next;
while (nextLink != null) {
// 比外循环小的值放在前面
if (nextLink.data > cu.data) {
min = nextLink.data;
nextLink.data = cu.data;
cu.data = min;
}
nextLink = nextLink.next;
}
cu = cu.next;
} } }

最后是测试类:

package com.wei;

public class Test {

    public static void main(String [] arr) {
LinkList g = new LinkList();
g.addlast(13);
g.addlast(16);
g.addlast(-3);
g.addlast(8);
g.addlast(5);
g.addlast(22);
g.Min_to_Max();
g.displayAllLink();
g.Max_to_Min();
g.displayAllLink();
}
}

一条链表就这样写完了,需要什么功能可以自己扩展。

java单链表的实现自己动手写一个单链表的更多相关文章

  1. 死磕 java同步系列之自己动手写一个锁Lock

    问题 (1)自己动手写一个锁需要哪些知识? (2)自己动手写一个锁到底有多简单? (3)自己能不能写出来一个完美的锁? 简介 本篇文章的目标一是自己动手写一个锁,这个锁的功能很简单,能进行正常的加锁. ...

  2. 死磕 java线程系列之自己动手写一个线程池

    欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. (手机横屏看源码更方便) 问题 (1)自己动手写一个线程池需要考虑哪些因素? (2)自己动手写 ...

  3. 自己动手写一个服务网关-java

    自己动手写一个服务网关 原文链接:https://www.cnblogs.com/bigben0123/p/9252444.html 引言 什么是网关?为什么需要使用网关? 如图所示,在不使用网关的情 ...

  4. 动手写一个简单版的谷歌TPU-指令集

    系列目录 谷歌TPU概述和简化 基本单元-矩阵乘法阵列 基本单元-归一化和池化(待发布) TPU中的指令集 SimpleTPU实例: (计划中) 拓展 TPU的边界(规划中) 重新审视深度神经网络中的 ...

  5. 动手写一个简单版的谷歌TPU-矩阵乘法和卷积

    谷歌TPU是一个设计良好的矩阵计算加速单元,可以很好的加速神经网络的计算.本系列文章将利用公开的TPU V1相关资料,对其进行一定的简化.推测和修改,来实际编写一个简单版本的谷歌TPU.计划实现到行为 ...

  6. 动手写一个简单的Web框架(模板渲染)

    动手写一个简单的Web框架(模板渲染) 在百度上搜索jinja2,显示的大部分内容都是jinja2的渲染语法,这个不是Web框架需要做的事,最终,居然在Werkzeug的官方文档里找到模板渲染的代码. ...

  7. 动手写一个简单的Web框架(Werkzeug路由问题)

    动手写一个简单的Web框架(Werkzeug路由问题) 继承上一篇博客,实现了HelloWorld,但是这并不是一个Web框架,只是自己手写的一个程序,别人是无法通过自己定义路由和返回文本,来使用的, ...

  8. 动手写一个简单的Web框架(HelloWorld的实现)

    动手写一个简单的Web框架(HelloWorld的实现) 关于python的wsgi问题可以看这篇博客 我就不具体阐述了,简单来说,wsgi标准需要我们提供一个可以被调用的python程序,可以实函数 ...

  9. 教你如何使用Java手写一个基于链表的队列

    在上一篇博客[教你如何使用Java手写一个基于数组的队列]中已经介绍了队列,以及Java语言中对队列的实现,对队列不是很了解的可以我上一篇文章.那么,现在就直接进入主题吧. 这篇博客主要讲解的是如何使 ...

随机推荐

  1. [学习笔记]连通分量与Tarjan算法

    目录 强连通分量 求割点 求桥 点双连通分量 模板题 Go around the Labyrinth 所以Tarjan到底怎么读 强连通分量 基本概念 强连通 如果两个顶点可以相互通达,则称两个顶点强 ...

  2. Python数据分析与展示第2周学习笔记(北理工 嵩天)

    单元4:Matplotlib库入门 matplotlib.pyplot是绘制各类可视化图形的命令子库,相当于快捷方式 import matplotlib.pyplot as plt # -*- cod ...

  3. java代码实现数据源切换(连接池简单粗暴)

    --最佳实践配置(.yml) gs.oracle: #driverClassName: oracle.jdbc.driver.OracleDriver driverClassName: oracle. ...

  4. 关于用struts2框架中iframe对应的jsp页面的不到action的值的问题

    我们做web项目经常会用到frameset.frame以及iframe,这大大方便了我们页面的构建以及模块功能的划分.但是,再使用这些技术的同时也会遇到各种各样的问题,其中一个就是子页面中得不到str ...

  5. TreeMap简介

    在Map集合框架中,除了HashMap以外,TreeMap也是常用到的集合对象之一.与HashMap相比,TreeMap是一个能比较元素大小的Map集合,会对传入的key进行了大小排序.其中,可以使用 ...

  6. 关于QGIS打开SHP文件属性表乱码

    解决方案是从网上看到的,一个台湾的朋友给出了具体的解决方法.但他说的方法的最后一步对我来说不适用,我稍作修改 具体如下:在线安装插件:Shapefile Encoding Fixer. 加载shp文件 ...

  7. java 数组的复制

    java数组的复制分为数组地址的复制和值的复制 地址的复制: int []arrA={11,22,33,44}; //创建一个数组 int [] arrB=new int[5]; System.out ...

  8. spring security梳理

    核心服务:AuthenticationManager,UserDetailsService和AccessDecisionManager The AuthenticationManager, Provi ...

  9. 基于Docker 部署Jmeter + Grafana + InfluxDB 性能测试监控配置(亲测可用)

    工具介绍: InfluxDB:是一款用Go语言编写的开源分布式时序.事件和指标数据库,无需外部依赖.该数据库现在主要用于存储涉及大量的时间戳数据,如DevOps监控数据,APP metrics, lo ...

  10. Jmeter之CSV文件读取

    注意execl表生成的CSV文件的文件编码是GB2312和分隔符就好了