有趣的链表相关题型

链表:也是线性表的一种。形象的来说:


就像火车的一个个车厢一样,一个个的链起来的。它有一个特点:它的头没有前驱,尾没有后继。

为什么会引入链表这个概念呢?之前我们知道的顺序表,是用数组的形式保存数据的。它使用起来也非常方便,优点在于它的尾删尾插非常方便,直接将数组空间大小加1,给最后一个数组赋值就ok了。但是对于数组来说,也有一定的缺点。比如:如果在中间插入或删除的话,就得移动一定得位数才可进行相关操作。最坏得情况是你在头插头删的时候,时间的消耗更巨大。为了避免这种重复的移位操作,我们引入了链表这个概念。链表的头插头删就容易多了,只需修改头节点的位置就好啦。

链表的种类很多,有单链表、双向链表、循环链表等。今天我们主要讲单链表。

那么链表的结构是怎么样的呢?

typedef int DataType;

struct Node
{
DataType data;             //节点里存放的数据
struct Node* next;         //指向下一个节点的指针
};

下面我们来一一实现它们吧~

//SList.h
#pragma once
#include<iostream>
using namespace std;
typedef int DataType;
typedef struct Node
{int data;struct Node* next;
}Node,*pNode;void InitSlist(pNode *pHead);void PushBack(pNode *pHead,DataType data);
void PopBack(pNode *pHead);void PushFront(pNode *pHead,DataType data);
void PopFront(pNode *pHead);
pNode BuyNode(DataType data);
pNode Find(pNode pHead, DataType data);
void Insert(pNode pos, DataType data);                //某个位置插入datavoid Erase(pNode* pHead, pNode pos);        //删除位置节点
void Remove(pNode* pHead, DataType data);     //删除某个数据的节点
void RemoveAll(pNode* pHead, DataType data);      //删除所有数据为data的节点
void Destroy(pNode* pHead);                 //销毁
int Empty(pNode pHead);                       //判空
int Size(pNode pHead);                          //节点数目
//SList.cpp
#include"SList.h"
#include<assert.h>void InitSlist(pNode *pHead)
{*pHead = NULL;
}pNode BuyNode(DataType data)                //创建一个新节点
{pNode newNode = (pNode)malloc(sizeof(Node));assert(newNode);newNode->data = data;newNode->next = NULL;return newNode;
}void PushBack(pNode *pHead,DataType data)
{if(*pHead == NULL){*pHead = BuyNode(data);(*pHead)->next = NULL;}else{pNode pCur = *pHead;while(pCur->next){pCur = pCur->next;}pCur->next = BuyNode(data);}
}void PopBack(pNode *pHead)
{if(*pHead == NULL)return;if((*pHead)->next == NULL){free(*pHead);*pHead = NULL;}else{pNode pCur = *pHead;pNode pPrev = NULL;while(pCur->next){pPrev = pCur;pCur = pCur->next;}free(pCur);pPrev->next = NULL;}
}void PushFront(pNode *pHead,DataType data)
{if(*pHead == NULL)*pHead = BuyNode(data);else{pNode cur = BuyNode(data);cur->next = *pHead;*pHead = cur;}
}void PopFront(pNode *pHead)
{if(*pHead == NULL)return;else{pNode pDel = *pHead;*pHead = (*pHead)->next;free(pDel);}
}pNode Find(pNode pHead, DataType data)
{pNode pCur = pHead;while(pCur){if(pCur->data == data){return pCur;}pCur = pCur->next;}return NULL;
}void Insert(pNode pos, DataType data)
{pNode newNode = BuyNode(data);if(pos == NULL)return;newNode->next = pos->next;pos->next = newNode;
}void Erase(pNode* pHead, pNode pos)
{pNode pCur = *pHead;if(*pHead == pos && (*pHead)->next == NULL){free(pos);*pHead = NULL;return;}while(pCur){pNode pPrev = pCur;while(pPrev->next == pos){pNode pDel = pos;pPrev->next = pos->next;free(pDel);return;}pCur = pCur->next;}return;
}void Remove(pNode* pHead, DataType data)
{pNode pos = Find(*pHead,data);Erase(pHead,pos);
}void Destroy(pNode* pHead)
{while(*pHead){pNode pDel = *pHead;*pHead = (*pHead)->next;free(pDel);}return;
}int Empty(pNode pHead)
{return pHead == NULL;
}int Size(pNode pHead)
{pNode pCur = pHead;int count = 0;if(pHead == NULL)return 0;while(pCur){count++;pCur = pCur->next;}return count;
}void Print(pNode pHead)
{pNode pCur = pHead;while(pCur){cout<<pCur->data<<"->";pCur = pCur->next;}cout<<"NULL"<<endl;
}

对于单链表,我们还有一些有趣的题来和大家分享哦。

有趣的链表问题>>点击进入喽


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

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

相关文章

简陋版C语言仿真通讯录

文件cotact.c #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include "contact.h" /*初始化*/ void InitContact(pContact pc) {pc->count 0;memset(pc->data, 0, sizeof(pc->data)); }/*增加数据*/ void AddCon…

pip3 便捷安装包

将虚拟环境下 的包列举出来 并保存到文件夹 pip3 freeze > requirments.txt 一次性安装文件里面所列举的所有的包 pip3 install -r requirments.txt

有趣的约瑟夫环问题

大家有没有听过约瑟夫环这个问题呢&#xff1f;我们先来看看它是一个什么样的问题~ 约瑟夫环&#xff08;Josephus&#xff09;问题是由古罗马的史学家约瑟夫&#xff08;Flavius Josephus&#xff09;提出的。该问题的说法不一&#xff0c;传说他参加并记录了公元66—70年犹太…

C语言模拟实现标准库函数之qsort() 2

C语言模拟实现标准库函数之qsort() <1> https://blog.csdn.net/csdn_kou/article/details/80158194 排序数字 int int_cmp(const void *elem1, const void *elem2) { return *(int *)elem1 - *(int *)elem2; }int main() { int arr[] { 9,8,7,6,5,4,3,2,1 }; int siz…

node.js windows下安装与配置

转自 https://www.cnblogs.com/liuqiyun/p/8133904.html

一系列链表题

1、链表的倒序输出&#xff1a;(输出4&#xff0c;3&#xff0c;2&#xff0c;1)在这里&#xff0c;可以使用递归的方式&#xff1a; <span style"font-size:18px;">void Reverse(pNode pHead) {if(pHead){Reverse(pHead->next);cout<<pHead->data…

简陋版C语言仿真通讯录之动态内存开辟版本

简陋版C语言仿真通讯录 https://blog.csdn.net/csdn_kou/article/details/80287640 简陋版C语言仿真通讯录之动态内存开辟版本 给Contact结构体增加一个容量&#xff0c;来表示什么时候增容 #define MAX_NAME 20 typedef struct PeoInfo {char name[MAX_NAME];int age;char …

node.js 代码修改 自动识别重启工具

npm install supervisor -g supervisor xx.js 代替 node xx.js 能实现自动重启服务&#xff0c;识别代码更新

C语言转移表之加减乘除无限进化版

主干程序初级版本进阶版本版本进化 主干程序 输入程序解析程序 /*解析字符串 有空格把空格分开 比如输入&#xff1a;add 1 2 解析后&#xff1a;add12*/ void do_parse(char *buf) {int state 0;int i 0;int argc 0;char *argv[8] {0};for (i 0; buf[i]; i){if (state …

node.js 笔记1 模块方面

url 模块 parse 解析url 可以用来获取查询参数 xx.js exports.xx xx 另一个文件引用 require(’./xx.js); 获取的句柄 相当于 xx.js 中的 exports xx.js module.exports xx 这样被人引用 相当于就是直接拿到了 xx 当require xx 的时候&#xff0c; 如果xx不在当前文件夹 &…

c++之指针引用

指针&#xff1a;指向一块内存地址的标识。 引用&#xff1a;给已经定义的变量起的别名。 格式&#xff1a; 类型 &引用变量名 已定义的变量名&#xff08;引用变量名和已定义的变量名可以看成是同一个实体&#xff0c;一个改变&#xff0c;另一个也随之改变&#xff0…

C语言之scanf中的格式

scanf函数原型控制格式1.%[^\n]%*c例子1例子2 1.%[]例子1例子2 scanf函数原型 int scanf( const char *format, ... ); 见可变参数求和 https://blog.csdn.net/csdn_kou/article/details/79996606 控制格式 %c 一个单一的字符 %d 一个十进制整数 %i 一个整数 %e, %f, %…

node.js 将文件目录读取 通过匿名函数自执行 将异步改为同步

var fs require(fs);var filesarray []; fs.readdir(html, function(error, files){if(error){console.log(error.stack);console.log(--------);console.log(文件夹读取失败);return false;}// 匿名函数自执行&#xff0c; 将异步改为同步(function getFile(i){console.log(…

蛇形数组打印(两种形式)

#蛇形数组打印 ##第一种形式 形式1 51 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 9 请按任意键继续. . .形式2 513 14 15 16 112 23 24 17 211 22 25 18 310 21 20 19…

node.js 获取异步方法里面的数据 =》 两种方式

第一种&#xff1a; 通过回调函数实现&#xff1a; var fs require(fs); function getmime(callback){ fs.readFile(./t1.js, function(err, data){// 现在理解&#xff0c;异步方法里还有别的引用 就不会提前释放callback(data);}); }getmime(function(data){console.log(…

python入门--基本语法

标准数据类型&#xff1a;Number(数字)&#xff0c;String(字符串)&#xff0c;List(列表)&#xff0c;Tuple(元组)&#xff0c;Sets(集合)&#xff0c;Dictionary(字典)Number只支持int(表示长整型)&#xff0c;float&#xff0c;bool&#xff0c;complex&#xff08;复数&…

Linux网站大杂烩《自己查阅》

从网络上拷贝别人归纳的列表。 Linux优秀网站列表 国内 http://www.chinaunix.net/ 国内最火爆的unix/linux论坛 http://www.linuxforum.net/ linux爱好者交流的场所&#xff0c;侧重编程开发 http://www.linuxaid.com.cn/ 面向初学者者提供资料 http://www.ibm.com/de…

python之条件、循环语句

其实&#xff0c;很多语言的语法都是相通的&#xff0c;包括初学python一样。 今天要说的是条件、循环语句。这部分也是相对比较简单的&#xff0c;就python而言&#xff0c;只是书写方式稍作改动罢了。 1、条件语句 &#xff08;1&#xff09;格式&#xff1a; if 判断条件…

node.js Promise简单介绍

转自百度&#xff1a; https://baijiahao.baidu.com/s?id1589455136001194151&wfrspider&forpc

数据结构之空间复杂度和空间复杂度

1.空间复杂度计算方法 2.时间复杂度计算方法非递归递归情况递归总次数*每次递归次数 1.空间复杂度 空间复杂度是指 执行这个算法所需要的内存空间。空间复杂度是函数中创建对象的个数关于问题规模函数表达式&#xff0c;一般情况下用O渐进表示法表示 计算方法 1.忽略常数&…