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

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. chromosome interaction mapping|cis- and trans-regulation|de novo|SRS|LRS|Haplotype blocks|linkage disequilibrium

    Dissecting evolution and disease using comparative vertebrate genomics-The sequencing revolution   s ...

  2. pyCharm专业版最新2018激活码激活

    说明:本人亲测有用,对Window.Linux.Mac都稳定有效. 缺点:需要修改hosts文件 步骤: 由于管理权限问题,大部分电脑都不能直接修改hosts文件,所以我们可以先将hosts文件复制到 ...

  3. [GX/GZOI2019]旅行者(dijkstra)

    二进制分组SB做法没意思还难写还可能会被卡常其实是我不会写.用一种比较优秀的O(Tnlogn)做法,只需要做2次dijkstra.对原图做一次.对反图做一次,然后记录每个点的最短路是从k个源点中的哪个 ...

  4. Python2 和 Python3的区别 更新中

    py2和py3的区别 1.默认解释器编码 py2: ascii py3: utf-8 2.输入 输出 输入 py2: name = raw_input('请输入你的姓名:') py3: name = ...

  5. spring自带的定时任务功能,基于注解和xml配置

    1.spring的配置文件 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=&quo ...

  6. DateTimePicket jQuery 日期插件,开始时间和结束时间示例

    需要引入的js文件: <input type="text" id="startTime" placeholder="开始时间"/> ...

  7. LGOJ1290 欧几里德的游戏

    题目链接 P1290 and UVA10368 (双倍经验[虽然标签差距很有趣]) 题目大意 给定两个数\(n\)和\(m\),每次操作可以用较大数减去较小数的正整数倍,不可以减成负数. 先获得一个\ ...

  8. python+selenium自动化测试之登录

    selenium_login.py import unittest from selenium import webdriver class LoginTest(unittest.TestCase): ...

  9. 使用命令安装laravel 项目

    cp .env.example .env   拷贝.env 文件 php artisan key:generate  生成秘钥 php artisan migrate   生成数据表 composer ...

  10. iOS商品详情、ffmpeg播放器、指示器集锦、自定义圆弧菜单、实用工具等源码

    iOS精选源码 电商商品详情 Swift.两种方式实现tableViewCell拖拽功能 ffmpeg+openGL播放器 微信聊天表情雨.表情下落.表情动画 iOS指示器集锦 弹窗增加 picker ...