JAVA数据结构——单链表
链表:一、 顺序存储结构虽然是一种很有用的存储结构,但是他有如下几点局限性:
1. 因为创造线性表的时候已经固定了空间,所以当需要扩充空间时,就需要重新创建一个地址连续的更大的存储空间。并把原有的数据元素复制进新的存储空间。
2. 因为顺序表要求数据的存储位置不仅是逻辑上相邻而且物理存储上也要相邻,所以当对数据进行增删操作的时候则会引起平均一半的数据元素移动。
综上所述:适合静态存储、对数据元素很少增删操作,则优先选择顺序表,对需要对数据频繁执行插入和删除操作,则选择动态的线性表-链表,链式存储不需要逻辑上相邻的元
素物理上也相邻,所以链表也带来了一定的局限性,失去了随机存取的特点。所以根据需求进行选择。
二、使用JAVA实现单链表:接口同顺序表:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
package com.usts.edu.list; /** * Created by Guanzhong Hu * Date :2019/12/27 * Description : 线性表 * Version :1.0 */public interface Ilist { // 将已存在的线性表置空 public void clear(); // 判断是否为空 public boolean isEmpty(); // 求线性表中数据元素个数并返回其值 public int length(); // 读取第i个元素的值 区间:[0,length()-1] public Object get(int i) throws Exception; // 插入元素,i表示插入的地址取值 区间:[0,length()-1],当为length()-1时,表示在表尾插入x public void insert(int i,Object x) throws Exception; // 删除位于第i个的元素 public void remove(int i) throws Exception; // 返回线性表中元素第一次出现的index public int indexOf(Object x) throws Exception; // 输出线性表中各个数据元素的值 public void display(); } |
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
package com.usts.edu.list; /** * Created by Guanzhong Hu * Date :2019/12/27 * Description :单链表 * Version :1.0 */public class Node { /** * 采用链式存储方式存储的线性表成为单链表 * 1. 链表中每一个结点包含存放数据元素值的数据域和存放指向逻辑上相邻结点的指针域 * 2. 若节点中只包含一个指针域,则称此链表为单链表 */ public Object data;//存放结点值 public Node next; // 存放逻辑指针 public Node(){ this(null,null);// 置空 }// 两个参数的单链表 public Node(Object data, Node next) { this.data = data; this.next = next; } // 带一个参数的单链表 public Node(Object data){ this(data,null); }} |
|
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
package com.usts.edu.list; import java.math.BigInteger;import java.util.Scanner; /** * Created by Guanzhong Hu * Date :2019/12/27 * Description :实现单链表 * Version :1.0 */public class LinkList implements Ilist { private Node head; public LinkList() { head = new Node();// 生成空的单链表 } // 置空 @Override public void clear() { head.data = null; head.next = null; } @Override public boolean isEmpty() { return head.next==null; // 头指针为null,则空 } @Override public int length() { int length = 0;// 初始化length Node n = head.next; // 初始化头指针,进行遍历 while (n != null){ n = n.next; // 迭代遍历 length++; } return length; } @Override public Object get(int i) throws Exception { Node n = head.next; int flag = 0;// 初始化查找参数,依次遍历寻找,当存在下一个头指针且flag = i时,则返回当前指针指向的下一个元素 while (n != null && i > flag){ n = n.next; flag++; } if (n==null|| i<flag){ throw new Exception("查找的第"+i+"个元素不存在!"); } return n.data; } @Override public void insert(int i, Object x) throws Exception { Node p = head; int flag = -1; // 定义计数器,从-1开始,因为第一个元素的头指针是-1; while (p!=null&&flag<i-1){ //寻找第i个结点的前驱,如果前驱小于则可以插入,否则当前元素位置已经占 p = p.next;// 已经指向当前结点的位置,需要后期插入成功后,指向下一个结点位置 flag++; } if (p==null&&flag>i-1) throw new Exception("插入位置不合法"); Node newNode = new Node(x); newNode.next = p.next; // 指向下一个结点位置 p.next = newNode;// 将当前生成的结点(下一个结点指针,当前节点元素)存入p的上一个结点的下一个结点的指针中 } @Override public void remove(int i) throws Exception { Node p = head; int flag = -1; // 同上 while (p!=null&&flag<i-1){ p = p.next; flag ++; } if (p==null&&flag>i-1) throw new Exception("删除位置不合法"); p.next = p.next.next;// 将此节点的上一个节点的指针指向当前删除节点的下一个结点 } @Override public int indexOf(Object x) throws Exception { Node p = head; int flag = -1; while (p!=null&&p.data.equals(x)){ p = p.next; flag ++; } if (p!=null) return flag; return -1; } @Override public void display() { Node p = head.next;// 如果指针含有下一个元素,则输出,并替换查询指针 while (p!=null){ System.out.print(p.data); p = p.next; } System.out.println(); } //创建链表,测试使用 public void createLinkList(int len) throws Exception{ // 头插法,创建len长度的链表 Scanner scanner = new Scanner(System.in); for (int i = 0; i < len ; i++) { insert(0,scanner.next()); } }} |
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
package com.usts.edu.list; import java.util.Scanner; /** * Created by Guanzhong Hu * Date :2019/12/27 * Description : 测试单链表 * Version :1.0 */public class ExampleLinkListTest { public static void main(String[] args) throws Exception { int len = 10; LinkList linkList = new LinkList();// 利用for生成链表 for (int i = 0; i < len ; i++) { linkList.insert(i,i); } System.out.println("请输入查找的值"); int i = new Scanner(System.in).nextInt(); if (i>0&&i<=len) System.out.println("第"+i+"个元素的直接前驱"+linkList.get(i-1)); linkList.display(); linkList.clear(); linkList.display(); linkList.insert(0,1); |
JAVA数据结构——单链表的更多相关文章
- Java数据结构--单链表
#java学习经验总结------单链表的建立与结点的增删 在该链表结点有data数据,并且还有cpu,分给cpu随机的时间片,根据时间片大小进行结点data的排序 链表结点的建立 class Lin ...
- java数据结构——单链表、双端链表、双向链表(Linked List)
1.继续学习单链表,终于摆脱数组的魔爪了,单链表分为数据域(前突)和引用域(指针域)(后继),还有一个头结点(就好比一辆火车,我们只关心火车头,不关心其它车厢,只需知晓车头顺藤摸瓜即可),头结点没有前 ...
- 数据结构——单链表java简易实现
巩固数据结构 单链表java实现 单链表除了表尾 每个几点都有一个后继 结点有数据和后继指针组成 通过构建表头和表尾(尾部追加需要)两个特殊几点 实现单链表的一些操作,代码如下 package co ...
- JAVA数据结构之链表
JAVA数据结构之链表 什么是链表呢? 链表作为最基本的数据结构之一,定义如下: 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的. 简单来说呢,链 ...
- Java实现单链表的各种操作
Java实现单链表的各种操作 主要内容:1.单链表的基本操作 2.删除重复数据 3.找到倒数第k个元素 4.实现链表的反转 5.从尾到头输出链表 6.找到中间节点 7.检测链表是否有环 8.在 ...
- java实现单链表的增删功能
JAVA 实现单链表的增删功能 package linked; class LinkedTable{ } public class LinkedTableTest { public static vo ...
- python实现数据结构单链表
#python实现数据结构单链表 # -*- coding: utf-8 -*- class Node(object): """节点""" ...
- C语言数据结构-单链表的实现-初始化、销毁、长度、查找、前驱、后继、插入、删除、显示操作
1.数据结构-单链表的实现-C语言 typedef struct LNode { int data; struct LNode* next; } LNode,*LinkList; //这两者等价.Li ...
- 使用java实现单链表(转载自:https://www.cnblogs.com/zhongyimeng/p/9945332.html)
使用java实现单链表----(java中的引用就是指针)转载自:https://www.cnblogs.com/zhongyimeng/p/9945332.html ? 1 2 3 4 5 6 7 ...
随机推荐
- 1)基本的MFC程序创建过程
1)基本的MFC创建过程: 2) 选择MFC应用程序: 3)然后选择特定的选项 直接完成就行了: 4)下面就是建成的样子: 5)然后是 运行结果: 6)有一个问题 那个 菜单栏是属于 F ...
- 年近30的Java程序员为了达到月入三万的目标,都做了哪些准备?
1.我觉得像我这般年纪的(29岁),有相对扎实技术功底的(就不自谦了),对赚钱有着强烈欲望的程序员,应该定一个切实的小目标——五年内月入三万! 之所以要定这个目标,最主要的原因是老婆的批评刺痛了我—— ...
- JavaSE--数字签名之校验签名
参考:http://blog.csdn.net/dotuian/article/details/51722300 关于keystore的简单介绍 Keytool是一个Java数据证书的管理工具 ,Ke ...
- nginx配置文件说明(包含IP黑名单、代理反射、负载均衡的配置)
先看下nginx配置文件整体结构 图片来源51cto 配置文件及注解: #运行用户 主模块指令,指定Nginx Worker进程运行用户以及用户组,默认由nobody账号运行 user nobody; ...
- 剑指offer【13】- 链表中倒数第k个结点
输入一个链表,输出该链表中倒数第k个结点. /* public class ListNode { int val; ListNode next = null; ListNode(int val) { ...
- SQL注入常用函数(注入小白的学习笔记)
在盲注的情况下,往往需要一个一个字符的去猜解,即过程中需要截取字符串 在这里整理了一下一些常用函数 由于现阶段学习不够深入,整理分类不清楚具体,不过博主会慢慢进行完善 user() 查询当前数据库用户 ...
- 架构之道(5) - APP和Web的后台架构
当一个项目,同时需要Web.手机H5.Android,三平台同时可以测览,那就需要很简洁而有力的架构. 而我这就经历了这麽一个项目,先开发网站,然后是手机H5,最后是Android. 自信男人,无须多 ...
- i春秋web作业2.26
Web安全工程师(入门班) [全国线上入门班53期]课后作业 2020-2-26 DorinXL 1)为什么说js校验是一种不安全的校验方式? js校验不安全,是因为用户很容易通过控制台删除或 ...
- dbgview 在windows 10 中关闭后再次打开时无法“capture kernel”
DbgView 是一个免费的用于抓取log 的工具,可以捕获并输出OutputDebugString()函数的输出,以及输出windows driver 中dbgprint 的log,对于window ...
- Mac环境下pyCharm的安装,激活及使用
1.pyCharm的安装 安装地址: https://www.jetbrains.com/pycharm/download/#section=mac 2.激活 获取注册码地址: http://idea ...