线性表----链表

链表分为单链表,循环链表,双向链表。
1,链表

采用链式方式储存的线性表称为链表,链表是用若干地址分散的存储单元存储数据元素。必须采用附加信息表示数据元素之间的逻辑关系(逻辑上相邻结点地址-指针域)。还包含元素本身的信息-数据域

2,单链表

指结点中只包含一个指针域的链表。单链表的头指针是线性表的起始地址,是线性表中第一个数据元素的存储地址,是单链表的唯一标识。单链表的尾结点没有后继节点,指针域为null。
单链表的结点的存储空间是在插入和删除过程中动态申请和释放的,不需要预先分配,从而避免了顺序表因空间不足要扩充空间或者复制元素的过程,避免了顺序表因容量过大造成的资源浪费的问题,提高了运行效率和存储空间的利用率。

在这里插入图片描述
Java代码描述

/*** 2020年3月31日下午5:43:19* 线性表的抽线数据Java接口  --线性表储存结构*/
package com.lovely.linearList;/*** @author echo lovely**/
public interface IList {void clear();boolean isEmpty();int length();Object get(int i) throws Exception; // 返回线性表数据中第i个元素void insert(int i, Object x) throws Exception; // 把x插入第i个位置void remove(int i) throws Exception;int indexOf(Object x);void display(); // 输出线性表各个元素的值}
package com.lovely.linearList;/** * 2020年4月1日下午8:25:10* * @author echo lovely** @category 节点类 用于存数据 和 后继节点*/public class Node {public Object data; // 存放节点数据值public Node next; // 存放后继节点public Node() {this(null, null);}// 只有节点值的构造函数public Node(Object data) {this(data, null);}// 带有节点值和后继节点的构造函数public Node(Object data, Node next) {this.data = data;this.next = next;}
}

实现链表功能

package com.lovely.linearList;import java.util.Scanner;/*** @author echo lovely** 2020年4月1日下午8:32:46* * 单链表的一系列操作*/public class LinkedList implements IList {public Node head; // 单链表的头指针public LinkedList() {this.head = new Node(); // 初始化 头节点}// 构造长度为n的单链表public LinkedList(int n, boolean order) {this();if (order) create1(n);elsecreate2(n);}public void create1(int n) {// 用尾插法顺序建立单链表  n为单链表长度Scanner sc = new Scanner(System.in);for (int i = 0; i < n; i ++) {try {insert(0, sc.nextInt());} catch (Exception e) {e.printStackTrace();sc.close();}}}public void create2(int n) {// 用头插法逆序建立单链表Scanner sc = new Scanner(System.in);for (int i = 0; i < n; i ++) {try {insert(length(), sc.nextInt());} catch (Exception e) {e.printStackTrace();sc.close();}}}@Overridepublic void clear() {// 将链表置空head.data = null;head.next = null; // 后继节点置空}@Overridepublic boolean isEmpty() {// 判断链表是否 是 空return head.next == null;}@Overridepublic int length() {// 链表长度Node p = head.next; // p 指向单链表的首结点int length = 0;while (p != null) {p = p.next; // 下个节点length ++;}return length;}@Overridepublic Object get(int i) throws Exception {Node p = head.next; // p指向单链表的首结点int j;// 从首结点开始向后查找 直到p指向第i个节点 或者结点为 nullfor (j = 0; j < i && p != null; j ++) {p = p.next;}if (j > i || p == null)throw new Exception("第" + i + "数据元素不存在");return p.data;}@Overridepublic void insert(int i, Object x) throws Exception {Node p = head; // 头指针int j = -1;// 寻找第i个节点的前驱while (p != null && j < i - 1) {p = p.next;j ++;}if (j > i - 1 || p == null)throw new Exception("插入位置不合法");// 创建结点Node s = new Node(x);s.next = p.next;p.next = s;}@Overridepublic void remove(int i) throws Exception {Node p = head;int j = -1;// 寻找第i个结点的前驱结点while (p != null && j < i - 1) {p = p.next;j ++;}if (j > i - 1 || p.next == null)throw new Exception("删除位置不合法");p.next = p.next.next;}@Overridepublic int indexOf(Object x) {Node p = head.next; int j = 0;while (p != null && !p.data.equals(x)) { // 数据元素存在,没查找到下个结点继续找p = p.next;j ++;}if (p == null)return -1;return j;}@Overridepublic void display() {Node p = head.next;while (p != null) {System.out.print(p.data + " ");p = p.next;}System.out.println();}}

测试

package com.lovely.linearList;import java.util.Scanner;public class TestLinkedList {public static void main(String[] args) {LinkedList list = new LinkedList(5, true);int i = list.indexOf(3);System.out.println(i);list.display();}static void showInsert() {int n,val;Scanner sc = new Scanner(System.in);System.out.println("请输入元素数组的个数:");n = sc.nextInt();LinkedList l = new LinkedList(); // 声明单链表for (int i = 0; i < n; i++) {Node q = l.head;System.out.print("输入" + (i + 1) + "个元素的值: ");val = sc.nextInt();Node p = new Node(val);while (q != null && q.next != null && Integer.valueOf(q.next.data.toString()) < val) {q = q.next;	}p.next = q.next; // 插入操作q.next = p;}Node k = l.head;for (int i = 0; i < n; i++) {k = k.next;System.out.println(k.data);}sc.close();}}

3,循环链表

链表首尾相连,尾结点的指针域指向头节点,环状的链表。

4,双向链表

有两个指针域,一个指针指向前驱结点,一个指针指向后继结点,查找快。

😵😵😵😵

比较顺序表和链表
顺序表查找快捷,靠下标。插入,删除效率低,需要移动很多数据。
链表插入,删除效率高,动态对储存空间分配。储存密度低,不可按照下标存取。查找遍历慢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/421012.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第七章 比高斯更快的计算

下面这段代码的功能是在显存0xb800:0 写入“123...1005050”这个字符串&#xff0c;没有什么难度。 ;代码清单7-1;文件名&#xff1a;c07_mbr.asm;文件说明&#xff1a;硬盘主引导扇区代码;创建日期&#xff1a;2011-4-13 18:02jmp near startmessage db 123...100start:mov ax…

第8章 硬盘和显卡的访问与控制

首先声明&#xff0c;这一章非常重要&#xff0c;如果刚开始读不懂&#xff0c;读不下去&#xff0c;一定要坚持&#xff0c;还有读这本书的一个要求是王爽《汇编语言》看两遍&#xff0c;并做完所有的课后实验。这一章其实是操作系统的的加载和引导过程。其中涉及的有硬盘读写…

和不安全的Android说再见,Google为它添加新铠甲

伴随着最近被曝出的Heartbleed漏洞&#xff0c;安全问题再次成为网络上的热点话题。虽然Android的安全性并没有外界传言的那样脆弱&#xff0c;但Google还是在继续为其增加防护措施。根据Android官方博客的消息&#xff0c;Google最近对Android上的应用程序验证机制进行了一次升…

face-recognition库(人脸识别库)安装,使用

一&#xff0c;起因 1&#xff0c;在某hub上下载了所谓“最简单的人脸识别项目”。 2&#xff0c;开始了face-recognition的安装之路。 3&#xff0c;人脸识别在win10上的使用&#xff0c;识别图像上面的人脸。 二&#xff0c;安装face-recognition库 1&#xff0c;我用的都…

python入门--字符串,切片

1&#xff0c;python关键字 2&#xff0c;代码的缩进&#xff08;有冒号, 下一行空格&#xff09; 注意下面 3&#xff0c;python多行语句 4&#xff0c;python空行 类与函数间空行&#xff0c;方法与方法间空行&#xff0c;函数与函数空行。 5&#xff0c;控制台输入 下…

第9章 中断和动态时钟显示

本章的第一个代码功能是在屏幕中间实时显示时间&#xff0c;其实现的思想是&#xff1a;cpu停机---》时间每秒更新一次&#xff0c;每一次更新都会引起0x70中断&#xff08;0x70中断的内容已经被我们更改为显示当前时间&#xff09;---》中断唤醒cpu开始执行我们的中断程序知道…

linux 架构

最内层是我们的硬件&#xff0c;最外层是我们常用的各种应用&#xff0c;比如说使用firefox浏览器&#xff0c;打开evolution查看邮件&#xff0c;运行一个计算流体模型等等。硬件是我们的物质基础&#xff0c;而应用是我们所要奋斗的目标&#xff0c;但在两者之间&#xff0c;…

py学习,列表,判断,循环

列表 1.1 列表是什么 python 中可以通过组合一些值得到多种复合数据类型。其中最常用的是列表&#xff0c;可以通过方括号括起&#xff0c;逗号分隔的一组值&#xff08;元素&#xff09;得到&#xff0c;一个列表可以包含不同类型的元素&#xff0c;一个列表的元素各个类型相同…

现代软件工程讲义 3 代码规范与代码复审

请参考原址&#xff1a;http://www.cnblogs.com/xinz/archive/2011/11/20/2255971.html 第10章 代码规范与代码复审 在第9章中&#xff0c;同学们完成了WC程序&#xff0c;经过评比&#xff0c;九条的程序获得了第一名。这时&#xff0c;阿超说&#xff0c;现代软件产业经过几十…

HDU 2159 FATE (DP 二维费用背包)

题目链接 题意 &#xff1a; 中文题不详述。 思路 &#xff1a; 二维背包&#xff0c;dp[i][h]表示当前忍耐值为i的情况下&#xff0c;杀了h个怪得到的最大经验值&#xff0c;状态转移方程&#xff1a; dp[i][h] max(dp[i][h],dp[i-a[j].toler][h-1]a[j].exper) ; 1 //21592 #…

TinyFrame升级之五:全局缓存的设计及实现

在任何框架中&#xff0c;缓存都是不可或缺的一部分&#xff0c;本框架亦然。在这个框架中&#xff0c;我们的缓存分为两部分&#xff1a;内存缓存和单次请求缓存。简单说来&#xff0c;就是一个使用微软提供的MemoryCache做扩展&#xff0c;并提供全局唯一实例&#xff1b;另一…

问题思维导向

杨淼信息与计算机科学 跆拳道国家一级教练员 曾经tricking爱好者3 人赞同了该回答一个不算建议的建议 直接看&#xff0c;看到不懂的就查相应的知识&#xff08;据说牛人都靠wiki活着&#xff09;。 知识当有需求的时候&#xff0c;才会学的更快。 觉得这样做的好处是&#xff…

【Mail】telnet收发邮件过程

文章原址&#xff1a;http://www.cnblogs.com/h--d/p/6125993.html 作者写的真棒&#xff0c;按照步骤一步一步都可执行&#xff0c;我是在centos7服务器下进行的实验&#xff0c;命令完全和下面一样&#xff0c;注意的地方是&#xff1a; 1&#xff0c;centos7要安装telnet&a…

入门训练 Fibonacci数列

http://lx.lanqiao.org/problem.page?gpidT4入门训练 Fibonacci数列 时间限制&#xff1a;1.0s 内存限制&#xff1a;256.0MB问题描述Fibonacci数列的递推公式为&#xff1a;FnFn-1Fn-2&#xff0c;其中F1F21。 当n比较大时&#xff0c;Fn也非常大&#xff0c;现在我们想知…

python模块与包的导入

一&#xff0c;模块 1&#xff0c;下面是hello.py脚本(模块)&#xff0c;有两求Fibonacci的函数. def fib1():a, b 0, 1print(0-10内:)while a < 10:print(a, end )a, b b, a bprint()def fib2(n):a, b 0, 1L []while a < n:L.append(a)a, b b, a bprint(L)retu…

第11章 进入保护模式

对照代码重点理解一下三个要点&#xff1a; 1,从实模式到保护模式的整体过程&#xff1b; 2&#xff0c;实模式怎样安装GDT&#xff1b; 3&#xff0c;从实模式怎样过渡到安全模式&#xff1b; 4&#xff0c;安全模式怎样寻址&#xff1b; 代码如下&#xff1a; ;代码清单1…

ASP.NET学习笔记之操作过滤器

转载于:https://www.cnblogs.com/kevin1988/p/3684442.html