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

  1. package com.wei;
  2.  
  3. public class Link {
  4. public int data;// 存放数据
  5. public Link next;// 存放下一个节点
  6.  
  7. public Link(int data) {
  8. this.data = data;
  9. }
  10.  
  11. public Link(int data, Link next) {
  12. this.data = data;
  13. this.next = next;
  14. }
  15.  
  16. public Link() {
  17. }
  18.  
  19. public void display() {
  20. System.out.println(data + " ");
  21. }
  22. }

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

  1. package com.wei;
  2.  
  3. public class LinkList {
  4.  
  5. public Link frist;// 定义一个头节点
  6. public Link last;//尾指针永远指向头节点
  7. public int size = 0;// 节点的位置
  8.  
  9. public LinkList() {
  10. this.frist = null;//
  11. }
  12.  
  13. /**
  14. * 判断链表是否为空
  15. *
  16. * @return
  17. */
  18. public boolean isis() {
  19. return size == 0;
  20. }
  21.  
  22. /**
  23. * 头插法
  24. *
  25. * @param data
  26. */
  27. public void addfrist(int data) {
  28. Link L = new Link(data);
  29. L.next = frist;
  30. frist = L;
  31. size++;
  32. }
  33.  
  34. /**
  35. * 尾插法
  36. *
  37. * @param data
  38. */
  39. public void addlast(int data) {
  40.  
  41. if (frist == null) {
  42. frist = new Link(data);
  43. last = frist;
  44. } else {
  45. Link newL = new Link(data);
  46. last.next = newL;
  47. last = newL;
  48. }
  49. size++;
  50. }
  51.  
  52. /**
  53. * 从头删除
  54. *
  55. * @return
  56. */
  57. public Link removefrist() {
  58. Link d = frist;
  59. frist = d.next;
  60. size--;
  61. return d;
  62. }
  63.  
  64. /**
  65. * 删除最后一个
  66. */
  67. public void dellast() {
  68. Dell(size - 1);
  69. }
  70.  
  71. /**
  72. * 获取链表长度
  73. */
  74. public void displayAllLink() {
  75. Link cure = frist;
  76. while (cure != null) {
  77. cure.display();
  78. cure = cure.next;
  79. }
  80. System.out.println("长度" + size);
  81. }
  82.  
  83. /**
  84. * 获取指定位置的节点元素
  85. *
  86. * @param index
  87. * @return
  88. */
  89. public Link getData(int index) {
  90. if (index < 0 && index > size - 1) {
  91. throw new IndexOutOfBoundsException("越界");
  92. }
  93. Link count = frist;
  94. for (int i = 0; i < size && count != null; i++, count = count.next) {
  95. if (i == index) {
  96. return count;
  97. }
  98. }
  99. return null;
  100. }
  101.  
  102. /**
  103. * 按值查找指定位置
  104. *
  105. * @param element
  106. * @return
  107. */
  108. public int selectIndex(int element) {
  109. Link current = frist;
  110. for (int i = 0; i < size && current != null; i++, current = current.next) {
  111. if (current.data == element) {
  112. return i;
  113. }
  114. }
  115. return -1;
  116. }
  117.  
  118. /**
  119. * 删除链表中数值最大的元素
  120. */
  121. public void delMax() {
  122. // 要遍历的链表
  123. Link cu = frist;
  124. // 初始化一个节点,当中间变量
  125. Link cc = new Link(0);
  126. // 遍历
  127. for (int i = 0; i < size && cu != null; i++, cu = cu.next) {
  128. if (cu.data > cc.data) {
  129. cc.data = cu.data;
  130. }
  131. }
  132. int data = cc.data;
  133. int number = selectIndex(data);
  134. Dell(number);
  135. }
  136.  
  137. /**
  138. * 删除链表中数值最小的元素
  139. */
  140. public void delMin() {
  141. // 要遍历的链表
  142. Link cu = frist;
  143. // 初始化一个节点,当中间变量
  144. Link cc = new Link(0);
  145. // 遍历
  146. for (int i = 0; i < size && cu != null; i++, cu = cu.next) {
  147. if (cu.data < cc.data) {
  148. cc.data = cu.data;
  149. }
  150. }
  151. int data = cc.data;
  152. int number = selectIndex(data);
  153. Dell(number);
  154. }
  155.  
  156. /**
  157. * 从指定位置处插入数据
  158. *
  159. * @param t
  160. * @param index
  161. */
  162. public void insert(int t, int index) {
  163. if (index < 0 || index > size) {
  164. throw new IndexOutOfBoundsException("索引超出线性表范围");
  165. }
  166. if (frist == null) {
  167. addlast(t);
  168. } else {
  169. if (index == 0) {
  170. addfrist(t);
  171. } else {
  172. Link k = getData(index - 1);
  173. k.next = new Link(t, k.next);
  174. size++;
  175. }
  176.  
  177. }
  178. }
  179.  
  180. /**
  181. * 从指定位置处删除
  182. *
  183. * @param index
  184. */
  185. public void Dell(int index) {
  186. if (index < 0 || index > size) {
  187. throw new IndexOutOfBoundsException("索引超出线性表范围");
  188. }
  189. Link del = null;
  190. if (index == 0) {
  191. del = frist.next;
  192. frist = frist.next;
  193. } else {
  194. Link neL = getData(index - 1);
  195. del = neL.next;
  196. neL.next = del.next;
  197. del.next = null;
  198. }
  199. size--;
  200. }
  201.  
  202. /**
  203. * 清空链表
  204. */
  205. public void clear() {
  206. frist = null;
  207. last = null;
  208. size = 0;
  209. }
  210.  
  211. /**
  212. * 按从小到大排序
  213. */
  214. public void Min_to_Max() {
  215. // 要遍历的链表
  216. Link cu = frist;
  217. // 记录最小值
  218. int min;
  219. while (cu != null) {
  220. // 内重循环从当前节点的下一个节点循环到尾节点,找到和外重循环的值比较最小的那个,然后与外重循环进行交换
  221. Link nextLink = cu.next;
  222. while (nextLink != null) {
  223. // 比外循环小的值放在前面
  224. if (nextLink.data < cu.data) {
  225. min = nextLink.data;
  226. nextLink.data = cu.data;
  227. cu.data = min;
  228. }
  229. nextLink = nextLink.next;
  230. }
  231. cu = cu.next;
  232. }
  233.  
  234. }
  235.  
  236. /**
  237. * 按从大到大排序
  238. */
  239. public void Max_to_Min() {
  240. // 要遍历的链表
  241. Link cu = frist;
  242. // 记录最小值
  243. int min;
  244. while (cu != null) {
  245. // 内重循环从当前节点的下一个节点循环到尾节点
  246. //找到和外重循环的值比较最小的那个,然后与外重循环进行交换
  247. Link nextLink = cu.next;
  248. while (nextLink != null) {
  249. // 比外循环小的值放在前面
  250. if (nextLink.data > cu.data) {
  251. min = nextLink.data;
  252. nextLink.data = cu.data;
  253. cu.data = min;
  254. }
  255. nextLink = nextLink.next;
  256. }
  257. cu = cu.next;
  258. }
  259.  
  260. }
  261.  
  262. }

最后是测试类:

  1. package com.wei;
  2.  
  3. public class Test {
  4.  
  5. public static void main(String [] arr) {
  6. LinkList g = new LinkList();
  7. g.addlast(13);
  8. g.addlast(16);
  9. g.addlast(-3);
  10. g.addlast(8);
  11. g.addlast(5);
  12. g.addlast(22);
  13. g.Min_to_Max();
  14. g.displayAllLink();
  15. g.Max_to_Min();
  16. g.displayAllLink();
  17. }
  18. }

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

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. 爬虫笔记(一)——快速使用urllib库

    本人以前用的都是python2.7,但看网上很多教程都是以python3为例的,所以便切换版本,导入urllib.lxml.beautifulsoup4等库. 下面介绍下两个版本对urllib库的区别 ...

  2. bzoj1396识别子串(SAM+线段树)

    复习SAM板子啦!考前刷水有益身心健康当然这不是板子题/水题…… 很容易发现只在i位置出现的串一定是个前缀串.那么对答案的贡献分成两部分:一部分是len[x]-fa~len[x]的这部分贡献会是r-l ...

  3. Codeforces 558E A Simple Task(计数排序+线段树优化)

    http://codeforces.com/problemset/problem/558/E Examples input 1 abacdabcda output 1 cbcaaaabdd input ...

  4. Work Scheduling(带反悔的贪心)

    https://www.luogu.org/problem/P2949 题目描述 Farmer John has so very many jobs to do! In order to run th ...

  5. ubantu中的mysql命令

    查看mysql的安装目录:which mysql 进入mysql的运行状态:mysql -uroot -p 56..a_

  6. day31-hmac模块检测客户端是否合法

    #如果客户端知道服务端的ip地址和端口,就可以连接服务端,信息不安全. #使用os.urandam随机生成32位bytes,然后hmac加密之后再发送给客户端. #server: import soc ...

  7. ioctl函数的使用之查看终端屏幕大小

    要想查看一个终端屏幕的大小,可以使用ioctl()函数,步骤如下. 1.首先找到对应终端的文件号,一般在   /dev/pts/....(0,1,2..).具体几号需要自己验证.如在pts目录下使用命 ...

  8. Python 网站后台扫描

    title date layout tags Python 网站后台扫描 2018-05-08 post Python #!/usr/bin/python # This was written for ...

  9. [LC] 426. Convert Binary Search Tree to Sorted Doubly Linked List

    Convert a BST to a sorted circular doubly-linked list in-place. Think of the left and right pointers ...

  10. 84)PHP,SQL注入基础讲解

     怎么预防: 填写防止SQL注入的代码: