K:线性表的实现—链表

【单链表】7-24 求链式线性表的倒数第K项 (20分) 给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。 输入格式: 输入首先给出一个正整数K,随后是若干非负整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理)。 输出格式: 输出倒数第K个位置上的数据。如果这个位置不存在,输出错误信息NULL。 输入样例: 4 1 2 3 4 5 6 7 8 9 0 -1 输出样例: 7 通过代码 AAA 尾插法创建链表,转化为查找正数第 len-k+1 项 #include <stdlib.h> #include &lt 阅读详情

单链表的概念:
 采用链式存储方式存储的线性表称之为链表,链表中每个节点包含存放数据元素的值的数据域和存放指向逻辑上相邻节点的指针域。若一个节点中只包含一个指针域,则称此链表为单链表。
单链表的特点:
 1. 单链表是通过指向后继节点的指针把它的一串节点连接成一个链
 2. 以线性表这种第一个数据元素的存储地址作为线性表的起始地址,称做线性表的头指针。一个单链表就是由他的头指针head来唯一的标识他。
 3. 单链表中的最后一个节点(尾节点)没有后继,所以它的指针域的值用空指针null。
 4. 为了操作方便,在第一个存入数据的节点之前加入一个虚节点称为“头节点”,头结点的数据域一般不存放具体的值,指针域存放指向第一个节点(首节点)的指针,指向头节点的指针为单链表的头指针。
 5. 若线性表为空表,则头指针的指针域为空
单链表的节点类的相关代码(java):
class Node<T>
{
 public T data;//用于存储相关的数据域
 public Node<T> next;//用于存储相关的指针域
 public Node()
 {
  this(null,null);
 }
 public Node(T data)
 {
  this(data,null);
 }
 public Node(T data,Node next)
 {
  this.data=data;
  this.next=next;
 }
}

单链表实现的相关代码(java):
public class LinkedList<T> implements List<T>
{
 public Node head;//用于存储头指针
 public LinkedList()
 {
  head=new Node();
 }
 public void clear()//清空,时间复杂度为O(1)
 {
  head=new Node();

 }
 public boolean isEmpty()//判空操作,时间复杂度为O(1)
 {
  return head.next==null;
 }
 public int length()//求长度
 {
  int k=0;
  Node p=head.next;
  while(p!=null)
  {
   k++;
   p=p.next;
  }
  return k;
 }

 public T get(int i)throws Exception//按位查找,其时间复杂度为O(n)
 {
  int j=0;
  Node p=head.next;
  while(j<i&&p!=null)
  {
   j++;
   p=p.next;
  }
  if(j>i||p==null)
  {
   throw new Exception(“查找的位置不存在”);
  }
  return p.data;
 }

 public int indexOf(T x)//按值查找,其时间复杂度为O(n)
 {
  int j=0;
  Node p=head.next;
  while(p!=null&&!p.data.equals(x))
  {
   j++;
   p=p.next;
  }
  if(p==null)
   return -1;
  else
   return j;
 }

 public void insert(int i,T x)throws Exception//插入操作,其时间复杂度为O(n)
 {
  int j=-1;
  Node p=head;
  while(j<i-1&&p!=null)//用于找到插入位置的前一个节点
  {
   j++;
   p=p.next;
  }
  if(i-1<j||p==null)
  {
   throw new Exception(“插入的位置不合法”);
  }
  Node s=new Node(x);
  s.next=p.next;
  p.next=s;
 }

 public void remove(int i)throws Exception//删除操作,时间复杂度为O(n)
 {
  int j=-1;
  Node p=head;
  while(j<i-1&&p.next!=null)
  {
   j++;
   p=p.next;
  }
  if(j>i-1||p.next!=null)
  {
   throw new Exception(“删除的位置不合法”);
  }
  p.next=p.next.next;
 }
}
ps:对于单链表的删除操作而言,其必须要找到进行删除的节点的前继节点,之后才能进行删除。删除某个特定节点的另一个思路是,将下一个节点的数据域的值赋值给本节点的数据域,之后,删除通过该特定节点,去删除下一个节点。这样做的局限在于,无法删除单链表中的最后一个节点。

其它链表:
 除了单链表之外,还有单链表的改进和结构的调整,常见的有循环链表和双向链表以及双向循环链表。
 ps:对于“链表”该名词,有两种含义,一种是指单链表,一种是指各种形式的链式存储结构。为此,“链表”的具体含义应该取决于上下文。
单向循环链表:
 循环链表也称为环形链表,其结构和单链表相似,只是将单链表的首尾相连,即将单链表的最后一个节点的后继指针指向第一个节点,从而构成一个环形链表
单向循环链表
在循环链表中,每一个节点都有后继,所以,从循环链表的任意一个节点出发都可以访问到单链表中的所有节点。
 对于单链表和循环链表,其API的实现上大多数没有什么区别,仅有的区别在于判断是否为最后一个节点的时候是否为头结点,而不是单链表实现上的最后一个节点为null。
 在实现循环链表时,既可以用头指针来标识循环链表,也可以用尾指针(所谓的尾指针,指的是指向末尾节点的指针)来标识,也可以头尾指针都用。若仅用头指针标识循环链表,则访问第一个节点的时间复杂度为O(1),但是访问最后一个节点的时间复杂度为O(n);若仅用尾指针标识的循环链表,则不论是访问第一个节点还是访问最后一个节点,其时间复杂度为O(1),所以,在实际操作中,使用尾指针来标识循环链表,这样会简化某些操作

双向链表
 在单链表中的节点仅仅包含指向其后继节点的指针,所以要查找一个指定节点的后继节点,只要顺着其后继指针即可找到,其时间复杂度为O(1),但是,若其要找到某个指定节点的前驱节点,则其需要从单链表的表头开始顺着链依次进行查找,其时间复杂度为O(n),为了解决这个问题,让每一个节点都有两个指针域,一个指向前驱节点,一个指向后继节点,此种链表就称为双向链表。
双向链表

双向循环链表
 将双向链表的首尾进行相连即可构成双向循环链表
双向循环链表

双向链表的节点插入及删除操作图
 插入:
插入
 删除:
删除

线性表(顺序表,链表的表示和实现) 本篇文章将从以下几点进行讲解:  1.线性表的类型定义  2.1线性表的顺序表示和实现  2.2线性表的链式表示和实现 1.线性表的类型定义: 接下来介绍下什么是线性表,学习每一样东西都要从定义下手. 由n( n>= 0 )个数据特性相同的元素构成的有限序列称为线性表//这个是官方给出的定义有点生僻 换句话说,统一线性表中的元素必定 具有相 阅读详情

相关推荐

【源代码】MyString类

用MyString类实现C++中string类功能,实现了大部分的代码,而且很工整严格,欢迎大家指出错误,共同进步。

数据结构与算法(三)——单链表

概述 链表是以节点的方式来存储 每个节点包含data域(存储有效数据),next域(指向下一个节点) 链表的各个节点不一定是连续存储的 链表分带头节点的链表和没有头节点的链表,根据实际的需求确定 逻辑结构 代码实现 /*** * 单链表 * * @author laowa * */ class SingleLinkedList { /** * 链表的头节点,不存放任何数据,作用就是作为链表的头 */ private Node head = new Node(0, "", "")

菜鸟的博客 501

同步辐射材料科学应用指南:从XAFS原位实验到数据处理

材料结构分析是材料研究的核心环节,但传统实验室X射线受限于能量固定、亮度不足,往往难以回答原子局域配位、非晶结构及动态演变等关键问题。同步辐射光源以高通量、连续可调、偏振可控及脉冲时间结构等特性,将材料表征从静态观察推进到原位动态追踪层次。基于X射线吸收精细结构谱(XAFS)、原位实验、X射线衍射与散射、微区成像等技术,研究人员可实现元素选择性分析、近邻原子环境解析及真实工况下的结构演变监测。本文从技术原理出发,覆盖实验方案设计、样品制备、现场对光、数据处理与常见故障排查,并结合典型应用场景,为材料科学领域

weixin_32612263的博客 173

编程题--Mystring类的编写

对于下面的类Mystring,要求重载运算符后可以计算表达式 a=b+c(a,b,c都是类Mystring的对象),请重载相应的运算符并别写程序测试   // 运算符重载.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #in

zhuimengzh的专栏 3634

Aitoearn内容营销的最佳开源 AI 代理,创建 · 发布 · 互动 · 副业一站式平台,支持渠道:抖音、小红书(红点)、微信通道、快手、哔哩哔哩、微信公众号、抖音等等

Aitoearn内容营销的最佳开源 AI 代理,创建 · 发布 · 互动 · 副业一站式平台,支持渠道:抖音、小红书(红点)、微信通道、快手、哔哩哔哩、微信公众号、抖音等等

struggle2025的博客 1751

【CMU-自主导航与规划】Autonomous Exploration Development Environment 实战:从环境搭建到多场景测试

本文详细介绍了CMU开源自主导航开发环境(Autonomous Exploration Development Environment)的实战部署与测试。内容涵盖从Ubuntu与ROS环境搭建、仿真场景配置,到核心导航模块(地形分析、局部避障、航点跟踪)的深度解析,并演示了如何集成TARE探索与FAR规划等上层算法,最终指导连接真实SLAM与实车部署,完成多场景性能评估。

weixin_29215391的博客 706

MyString

#include <iostream> #include <assert.h>using namespace std;class MyString { public: MyString() { data = new char[1]; data[0] = '\0'; length = 0; } MyString(const MyS

杨葳的博客 347

手把手教你学simulink(41.4)--逆变器电场景示例:基于Simulink的主从控制的多逆变器协同控制(Multi-Inverter Coordinated Control)

需求分析在现代电力系统中,分布式发电和储能系统的广泛应用使得多个逆变器并联运行成为常见的应用场景。为了确保多个逆变器之间的协同工作,实现系统的稳定性和高效性,通常采用主从控制(Master-Slave Control)策略。主从控制通过一个主控制器(Master)来协调多个从控制器(Slave),确保所有逆变器的输出电压、频率和功率分配符合预期目标。本项目将基于Simulink平台,开发一个多逆变器协同控制系统,采用主从控制策略,实现对多个逆变器的精确控制和优化。

MHD0815的博客 307

线性表的链表实现和分析

目录 一、单链表 二、代码和讲解: 结构体定义: 函数声明: 初始化: 按位插入(带头结点) 按位插入不带头结点 指定结点的后插操作 指定结点的前插操作 判空操作 按位序删除(带头结点) 指定结点的删除 按位查找(基于带头结点) 按值查找(带头结点) 求表长 链表的构建 尾插法 (带头结点) 头插法(带头结点、重要应用“数组逆置”) 显示函数 三、小结: 下一篇: 一、单链表 优点:不要求大片连续空间,改变容量方便 缺点:不可随机存取,要耗费一定空间存放...

weixin_46919419的博客 698

【项目实战】TARA威胁分析和风险评估

TARA是信息安全领域中的一种风险评估方法,在汽车信息安全的上下文中,TARA分析特别重要,因为它可以帮助识别和管理与智能网联车辆相关的各种威胁,包括数据泄露、未经授权的访问、远程操控等。通过TARA分析,企业可以制定出针对性的安全目标、产品要求和产品安全声明,以确保汽车及其零部件符合相关的信息安全标准和法规。此外,TARA分析还可以与数字化建模系统结合,以更系统化和高效的方式进行风险评估和管理。

奶爸的编程之路,也就一周冷个三天 2713

脉冲变压器电感选型参数,结构原理,工艺与注意问题总结

脉冲变压器电感简称脉冲变压器,是一种特殊类型的变压器,主要用于处理脉冲信号。它的主要特性是能够在短时间内承受高电压和大电流。脉冲变压器主要用于开关电源、脉冲功率放大、雷达脉冲调制等领域。本文对脉冲变压器的工作原理,结构特点,工艺流程,选型参数及设计注意事项进行总结。

fydar的博客 1347

K:线性表的实现—链表

单链表的概念:  采用链式存储方式存储的线性表称之为链表,链表中每个节点包含存放数据元素的值的数据域和存放指向逻辑上相邻节点的指针域。若一个节点中只包含一个指针域,则称此链表为单链表。 单链表的特点:  1. 单链表是通过指向后继节点的指针把它的一串节点连接成一个链  2. 以线性表这种第一个数据元素的存储地址作为线性表的起始地址,称做线性表的头指针。一个单链表就是由他的头指针head来...

diaosangwan0363的博客 143

11年电赛综合测评——单运放三角波发生器

目录 背景知识科普: 原理:局部负反馈+大环负反馈+积分器 仿真图如下: 背景知识科普: 反馈电路是将放大器输出信号(电压或电流)的一部分或全部,回收到放大器输入端与输入信号进行比较(相加或相减),并用比较所得的有效输入信号去控制输出,这就是放大器的反馈过程。 一、反馈放大器反馈极性的经验分析法—符号法 分析步骤1.在输入端上加上一个“+”或“-”的输入信号,按瞬时极性法标出反馈放大器中各个电极(基极b,集电极c,发射极e)电压的瞬时性。 2.判断经放大和反馈后得到的反馈信号Xf的瞬时极性

沉迷单车的追风少年 9906

求链式线性表的倒数第K项

求链式线性表的倒数第K项 给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。 输入格式: 输入首先给出一个正整数K,随后是若干非负整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理)。 输出格式: 输出倒数第K个位置上的数据。如果这个位置不存在,输出错误信息NULL。 输入样例: 4 1 2 3 4 5 6 7 8 9 0 -1 输出样例: 7 标程 ​ 单链表版 #include<map> #include<list> #include<cm

a1351937368的博客 716

天爱验证码wasm验证码逆向

本文分析了某网站采用WASM加密技术的情况,发现其加密方式主要针对data和轨迹信息,整体加密逻辑变化不大。通过反混淆技术可以还原代码,并确认加密过程分为两步:先对原始参数逐个加密,再调用WASM模块进行最终加密。研究发现关键参数drives和ki都存储在WASM模块内,通过提取wasm_exec.js文件即可直接使用该加密功能。本文仅提供技术研究思路,强调严禁用于任何违法行为。

码王吴彦祖的博客 936

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

数据结构:线性表的应用

cout << "--- 测试 3: 分隔链表 (以 3 为界) ---" << endl;cout << "--- 测试 4: K 个一组翻转 (k=2) ---" << endl;cout << "向右旋转 " << k_rot << " 位后的结果: ";cout << "--- 测试 1: 合并有序链表 ---" << endl;cout << "--- 测试 2: 旋转链表 ---" << endl;// --- 测试 2: 旋转链表 ---// --- 测试 3: 分隔链表 ---

wz996924的博客 175

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

PAT1021. 求链式线性表的倒数第K项(15)

1021. 求链式线性表的倒数第K项(15) 时间限制 250 ms 内存限制 32000 kB 代码长度限制 8000 B 判题程序 Standard 给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。 输入格式说明: 输入首先给出一个正整数K,随后是

wo_shazi的专栏 660

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

数据结构 -- 线性表:头结点实现单链表、头指针实现单链表、找到倒数第K个结点 O(1)下删除单链表结点P,P不为尾结点、判断两个单链表是否相交,返回相交的第一个结点、判断两个单链表是否有环,返回入环

链表的概念 头结点实现单链表 头指针实现单链表 单链表节点面试题: 找到倒数第K个结点 O(1)下删除单链表结点P,P不为尾结点 判断两个单链表是否相交,返回相交的第一个结点 判断两个单链表是否有环,返回入环的第一个结点 将单链表原地逆置

kyrie_sakura的博客 163

数据结构 2-0 线性表总结

例题 从王道数据结构上拔下来几道题目 这个题目考的就是malloc函数寻找连续空间的特点,需要开辟的长度是m+n,所以malloc函数会在内存上找长度为m+n长度的连续空间。malloc一定是从头去分配,而不是再原来的部分再向后续接。 统考题就是有东西,这里先将数组分为两部分,用a代表要移动到后面去的下标0到p-1的数据,b代表剩下部分,如果直接循环移动,必然会有大量的时间浪费在移动数据上,答案则是用了起始状态的数据特点,先把a逆转,再逆转b,最后逆转整个数组,虽然时间复杂度也不小,但是相比较之下的确是

博客标题不能为空我也没办法 273

数据结构之线性表(顺序表、单双向链表)

本文介绍了顺序表,单链表,双向链表的一些基础操作(增删改查,合并有序表)等,以及单链表的一些扩展。

miracleAshing的博客 613

一:线性表:链表的初始化操作及应用

内容节点结构InitList(*L):初始化一个线性表ListEmpty(L):判断是否为空表ClearList(*L):清空线性表GetElem(L,i,*e):将表中的第i个元素,返回给eLocateElem(L,e):查找表中是否有与e相等元素ListInsert(L,i,e):在线性表的第i个位置插入元素eListDelete(*L,i,*e):删除线性表中的第i个元素,并将值返回给eListLength(L): 返回线性表元素的个数头插法插入元素尾插法求两个线性表La和Lb的并集求两个线性表La和

@76135327的博客 8146

线性表与链表

本文系统介绍了线性表的两种存储结构:顺序存储和链式存储。

2302_79695841的博客 1693

线性表各种基本操作实现代码

//容易 //线性表各种基本操作实现代码 #include<cstdio> #include<cstring> #include<cstdlib> #include<ctime> #define ElemType int #define Status int #define ERROR 0 #define OK 1 using namespace std; typedef struct Node { ElemType data;//单链表结点的数据.

qq_41954073的博客 5254

实现一个链接存储的线性表(数据结构与算法 - 线性表)

完成一个链接存储的线性表的小程序。 相关知识 线性表的存储也可以采用链接存储方式来实现。链接存储方式包括单链表、双链表和循环链表等形式。 下面描述了一种基于单链表的线性表实现方案: 为了讨论简单,假设数据元素的类型为整型: typedef int T; 在链表中,每个数据元素为一个链表结点,结点的具体定义为: struct LinkNode { T data; LinkNode...

韶言大雅 8877
上一篇: K:顺序表和链表的比较
下一篇: k:特殊的线性表—栈
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值