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

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. (一)Thread的run() 和 start() 方法

    Java多线程在实际开发中会遇到很多问题,对于这种争抢CPU时间片段的选手,我们或许有很多困惑,捉摸不透.即便如此,它也是可以被我们控制的. 最近在看Java多线程的书籍,里面有好多我曾经不怎么注意的 ...

  2. 39)PHP,选取数据库中的两列

    首先是我的文件关系: 我的b.php是主php文件,BBB.php是配置文件,login.html是显示文件, b.php文件代码: <?php /** * Created by PhpStor ...

  3. Office Shared-Addin : Favorite的下载、安装和使用(2020.2.22)

    Favorite是一个可以用于Office常用组件.VBA的共用加载项,32位和64位都兼容. 如果是Office 2007及其以上版本,界面显示为Custom UI+任务窗格. 如果是Office ...

  4. 《C程序设计语言》练习 1-12

    #include<stdio.h> /*编写一个程序,以每行一个单词的形式打印其输入*/ main() { int c; c=getchar(); while(c!=EOF) { if ( ...

  5. ip获取到城市

    <?phpfunction GetIP() {    if ($_SERVER["HTTP_X_FORWARDED_FOR"])        $ip = $_SERVER[ ...

  6. [LC] 240. Search a 2D Matrix II

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

  7. 吴裕雄--天生自然Android开发学习:1.2.1 使用Eclipse + ADT + SDK开发Android APP

    1.前言 这里我们有两条路可以选,直接使用封装好的用于开发Android的ADT Bundle,或者自己进行配置 因为谷歌已经放弃了ADT的更新,官网上也取消的下载链接,这里提供谷歌放弃更新前最新版本 ...

  8. make的使用和Makefile规则和编程及其基本命令(简单)

      转自:http://blog.chinaunix.net/uid-23929712-id-2650328.html   概述: make从Makefile中文件中获取模块间的依赖关系,判断哪些文件 ...

  9. jQuery ajax中的参数含义

    所有options均可选,下面简要说明每个option 1.async 默认为true,即请求为异步请求,这也是ajax存在的意义.但同时也可以将这个参数设置为false,实现同步请求.(同步请求会锁 ...

  10. 吴裕雄--天生自然python学习笔记:Python3 面向对象

    Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的. 面向对象技术简介 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集 ...