线性表(1)

news2024/11/25 7:16:11

线性表即“把所有数据按照顺序(线性)的存储结构方式,存储在物理空间”。

线性表又分为

  • 顺序表
  • 链表
  1.  单向链表
  2. 双向链表

一、顺序表 

数据依次存储在连续的物理空间中,就比如数组。

顺序表存储数据时,会提前申请一整块足够大小的内存,然后将数据依次存储起来,元素的存储空间在内存中是连续存在的。

顺序表的优点:

  •  内存地址连续,数组元素进行遍历时,速度快。
  • 根据下标,查找指定位置的元素时,速度快。(时间复杂度为  O(1)  )

顺序表的缺点:

  • 长度固定,使用前需要预估长度。
  • 插入删除元素时,时间复杂度相对较高。(时间复杂度为  O(n)  )

二、链表 

与顺序表不同,链表不限制数据的物理存储位置,使用链表存储的数据元素,其物理存储位置是随机的。

链表中每个数据的存储都由以下两部分组成:

1G4212457-2.gif

  1. 数据元素本身,其所在的区域称为数据域;
  2. 指向直接后继元素的指针,所在的区域称为指针域

 链表的优点:

  • 使用链表结构,不需要提前预估长度,可以克服数组需要预先知道数据长度的缺点
  • 链表使用不连续的内存空间,可以充分利用计算机内存空间,实现灵活的内存动态管理

链表的缺点: 

  • 链表相比于数组会占用更多的空间,因为链表中每个节点中,除了存放元素本身,还有存放指向其他节点的指针
  • 不能随机读取元素(RandomAccess
  • 遍历和查找元素的速度比较慢

链表又分为:

  1. 单向链表
  2. 双向链表
  3. 循环链表
  4. 双向循环链表

(1)单向链表

1、单向链表的节点定义

//单向链表的节点定义
static class Node<E>{
    E item;//元素值
    Node<E> next;//后继节点(指针域)
    public Node(E data){
        this.item=data;
    }
}

2、链表的遍历 

//	链表的遍历
	@Override
	public String toString() {
		StringJoiner sj=new StringJoiner("->");
		//从首元素开始遍历
		for(Node<E> n=first;n!=null;n=n.next) {
			sj.add(n.item.toString());
		}
		return sj.toString();
	}

3、头插法 

其主要思想为在原链表的头部添加一个新元素,我们只需要创建出一个新元素,然后让这个新元素的后继节点指向原来的头结点。

public class Linked<E>{
    //头节点
    Node<E> first;

    //尾节点
    Node<E> last;

    //添加新元素(头插法)
    public  void addfirst(E item){
        final Node<E> newfirst=new Node<E>(item);//创建出新的头节点
		final Node<E> f=first;//将原来的头节点存储起来
		first=newfirst;//将新创建的新的节点赋给头节点
		if(f==null) {
			last=newfirst;//如果这个链表为空时,它的头节点和尾节点都为所要添加的这个新节点
		}else {
			newfirst.next=f;//如果链表不为空,则新节点的后继节点指向原来的头节点
		}
    }
}

4、尾插法

其主要思想是在原链表的尾部添加一个节点,使得原来的尾节点的后继节点指向新添加的这个新节点

//	尾插法
	public void addlast(E item) {
		final Node<E> newlast=new Node<E>(item);
		final Node<E> l=last;//将原来的尾节点存储起来
		last=newlast;//将创建的新的节点赋给尾节点
		if(l==null) {
			first=newlast;
		}else {
			l.next=newlast;//如果链表不为空,则原尾结点的后继节点指向新节点
		}
	}

5、删除头结点

其主要思想是删除旧的头节点,再将旧的头节点的后继节点作为新的头节点

//	删除头结点
	public void delfirst() {
		final Node<E> f=first;//先保存头节点
		final Node<E> next=f.next;//拿到头节点的后继节点
		f.item=null;//删除旧的头节点
		f.next=null;
		first=next;//设置新的头节点
		if(next==null) {
			//单向链表为空,则尾结点为null
			last=null;
		}
	}

(2)循环链表

循环链表 其实是一种特殊的单链表,和单链表不同的是循环链表的尾结点不是指向 null,而是指向链表的头结点。

循环链表2.png

(3) 双向链表

双向链表.png

1、双向链表的节点类

static class Node<E>{
		E item;//数据域
		Node<E> prev;//前驱节点
		Node<E> next;//后继节点
		
//		构造方法
		public Node(E element,Node<E> prev,Node<E> next) {
			this.item=element;
			this.next=next;
			this.prev=prev;
		}

2、双向链表的头插法 

双向链表在头插法时,其新加入的节点的前驱节点指向null,后继节点指向原来的头节点

    Node<E> first;
	Node<E> last;
	int size=0;
	
	public  void addfirst(E item) {
		final Node<E> f=first;
		final Node<E> newfirst=new Node<E>(item,null,f);
		first=newfirst;
		if(f==null) {
			last=newfirst;
		}else {
			newfirst.next=f;
		}
		size++;
	}

3、双向链表的尾插法

双向链表的尾插法,其新加入的节点前驱节点指向原尾结点,后继节点指向null

public void addlast(E item) {
		final Node<E> l=last;
		final Node<E> newlast=new Node<E>(item,l,null);
		last=newlast;
		if(l==null) {
			first=newlast;
		}else {
			l.next=newlast;
		}
		size++;
	}

4、删除头节点 

// 删除链表头节点
public void removeFirst() {
    // 获取头结点
    final Node<E> f = first;

    // 获取头结点的下一个节点
    final Node<E> next = f.next;

    // 清空头结点
    f.item = null;
    f.next = null; // help GC

    // 设置链表的头结点
    first = next;

    if (next == null)
        last = null;
    else
        next.prev = null;
    
    // 链表长度自减
    size--;
}

 

5、 删除尾结点

// 删除链表尾节点
public void removeLast() {
    // 获取尾节点
    final Node<E> l = last;

    // 获取尾节点的“上一个元素”
    final Node<E> prev = l.prev;

    // 清空尾节点
    l.item = null;
    l.prev = null; // help GC

    // 设置链表的尾节点
    last = prev;

    if (prev == null)
        first = null;
    else
        prev.next = null;
    
    // 链表长度自减
    size--;
}

(4)双向循环链表

双向循环链表 最后一个节点的 next 指向 head,而 head 的 prev 指向最后一个节点,构成一个环。

双向循环链表.png

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

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

相关文章

centos7忘记root密码重置办法~超简单

此重置linuxroot密码的教程是在centos linux环境中进行的&#xff01;不同版本的linux重置密码的方法是有一定的差的&#xff01; 一. 在下面的页面按“ e ” 编辑内核信息 二. 删除 “ rhgb quiet ” 三. 添加“ rd.break enforcing0 ” ,然后按 Ctrl X进入交互页面 四…

参与抖音官方活动:开启抖音小店的曝光与销售新机会

抖音官方活动是指由抖音平台官方组织或合作举办的各类促销活动、品牌推广活动等。参与抖音官方活动对于抖音小店来说&#xff0c;是一个重要的机会&#xff0c;可以帮助店铺获得更多的曝光和销售机会。下面四川不若与众将介绍抖音小店如何参与抖音官方活动的一般步骤和注意事项…

【LeetCode热题100】--234.回文链表

234.回文链表 快慢指针&#xff1a; 将链表的后半部分反转&#xff08;改变链表结构&#xff09;&#xff0c;然后将前半部分和后半部分进行比较。比较完成后我们应该将链表恢复原样。虽然不需要恢复也能通过测试用例 使用快慢指针在一次遍历中找到链表的中间位置&#xff1a…

【红外与可见光图像融合】离散平稳小波变换域中基于离散余弦变换和局部空间频率的红外与视觉图像融合方法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

003:如何画出成交量的柱状图

接着《002&#xff1a;如何画出收盘价的曲线图》&#xff0c;继续画成交量柱状图。 import pandas as pd import matplotlib.pyplot as plt# 读取CSV文件&#xff0c;指定逗号作为分隔符 data pd.read_csv(002885.csv, sep,)# 提取成交量和日期数据 volume data[成交量] dat…

tailwind使用教程以及tailwind不生效的问题

以Vite项目为例 我们先安装依赖文件 生成文件 yarn add -D tailwindcss postcss autoprefixer npx tailwindcss init -p配置tailwind.config.js文件 /** type {import(tailwindcss).Config} */ export default {content: ["./index.html","./src/**/*.{vue,j…

基于MWORKS.Sysplorer的油气混合作动筒建模与仿真应用

作为常见的线性传动装置&#xff0c;液压作动筒因其高功率密度和传动平稳、可控性好等特点而被广泛应用于各领域。常规的液压作动筒以油液为介质传递动力&#xff0c;其原理结构如图1所示。液压油从无杆腔进入&#xff0c;推动作动筒活塞伸出&#xff1b;或从有杆腔流入&#x…

递归的总结和案例

①使用递归的方法获取1-100的总和 function sum(num){ if(num 1){ return num 1 }else { return numsum(num-1) } } let num 100 let numSum sum(num) console.log(numSum,numSum) ②数组求和 function arrSum (arr){ let len arr.length…

第十四届蓝桥杯大赛软件赛决赛 C/C++ 大学 B 组 试题 B: 双子数

[蓝桥杯 2023 国 B] 双子数 试题 B: 双子数 【问题描述】 若一个正整数 x x x 可以被表示为 p 2 q 2 p^2 \times q^2 p2q2&#xff0c;其中 p p p、 q q q 为质数且 p ≠ q p \neq q pq&#xff0c;则 x x x 是 一个 “双子数”。请计算区间 [ 2333 , 233333333333…

数据结构-在堆中插入或删除新元素

目录 在堆中插入新元素 在堆中删除元素 知识回顾 在堆中插入新元素 首先插入13&#xff08;这里我们依据的是小根堆原则&#xff0c;遇到大根堆也是类似的&#xff09; &#xff08;1&#xff09;将新元素放到队列的队尾&#xff0c;在完全二叉树里面显示的是堆底 如下图…

ElasticSearch - 基础概念,以及和 mysql 的对比

目录 一、ElasticSearch 基础概念 1.1、文档&#xff08;document&#xff09; 1.2、索引&#xff08;index&#xff09; 1.3、映射&#xff08;mapping&#xff09; 二、对比 mysql 2.1、概念对比 2.2、适用场景对比 2.2.1、那是不是说&#xff0c;有了 es 之后&#…

Win10下获取海康威视网络串流(顺便求教Ubuntu服务器做法)

如果有摄像头专供充电器最好&#xff0c;那样可以用交换机&#xff0c;而且可以用海康威视官方的&#xff08;大概&#xff09;400密码重置助手获取摄像头IP地址&#xff0c;并做账号初始化等工作 我是一开始还有充电器的时候做了账号初始化&#xff0c;但是现在找不着充电器了…

java - 数组工具类Arrays

目录 前言 一、Arrays是什么? 二、常用方法 1.toString()&#xff1a;将数组转换为字符串形式。 2. binarySearch()&#xff1a;在已排序的数组中查找指定元素的索引。 3.fill()&#xff1a;将数组的所有元素都设置为指定值。 4. copyOf()&#xff1a;将一个数组的部分或…

【实训项目】益农小程序

1.项目背景 受到疫情影响&#xff0c;农作物物流运输受阻、产品滞销&#xff0c;给农民的“菜园子”和市民的“菜篮子”带来不少影响&#xff0c;一边是农民种植的蔬菜、草莓等地产农副食品滞销&#xff0c;一边是城区居民买不到新鲜、实惠的农副产品。 有很多地区&#xff0…

【解决方案】‘create’ is not a member of ‘cv::aruco::DetectorParameters’

‘create’ is not a member of ‘cv::aruco::DetectorParameters’ 在构建AruCo标定板标定位姿代码的过程中&#xff0c;发现代码中认为create并不是aruco::DetectorParameters的成员函数&#xff0c;这是因为在4.7.0及以上的OpenCV版本中&#xff0c;对ArUco的代码做调整&…

【KingFusion】如何在3D场景实现流水效果

哈喽&#xff0c;大家好,我是雷工&#xff01; 在项目过程中&#xff0c;经常会涉及到实现管道水流动效果&#xff0c;此篇记录在KingFusion中的3D场景实现水流效果。 以下为简单流水效果的样例&#xff0c; 一、效果展示 当点击水泵&#xff0c;水泵启动&#xff0c;显示流水…

Linux开篇指南针环境安装(第一课)

Linux开篇指南针(第一课) 1 LINUX 系统介绍 Linux是一种自由和开放源代码的类UNIX操作系统&#xff0c;它最初由芬兰的林纳斯托瓦兹在1991年创建。Linux是一种多用户、多任务操作系统&#xff0c;可以在各种硬件平台上运行&#xff0c;包括桌面、移动设备、服务器和超级计算机…

JavaScript项目1_猜数字(前导)

● 本节&#xff0c;我们将做这样的一个小游戏&#xff0c;意思就是随机生成一个数字&#xff0c;然后你去猜测&#xff0c;本文不涉及HTML和CSS的代码&#xff0c;如果有需要的话可以私信我&#xff01; document.querySelector() document.querySelector() 是 JavaScript 中…

vue2.x 迭代更新项目去掉缓存处理

找到build文件下的webpack.prod.conf.js文件 定义一个常量version const Version new Date().getTime(); 然后在.js和.css前面加上.${Version}就可以了&#xff08;注意得把原本的换成&#xff09;

Dink进阶之路

1、环境变量 cat /etc/profile #flink需要 export HADOOP_CLASSPATHhadoop classpath export HADOOP_CONF_DIR/etc/hadoop/conf2、Flink配置 2.1、flink-conf.yaml jobmanager.rpc.address: node-146 jobmanager.rpc.port: 6123 # 设置jobmanager总内存 jobmanager.memory.…