数据结构之链表(高级应用)

基本的算法实践在上一篇博文,这篇博文向大家详细展示一下数据结构的高级应用,可能有些难,但这是重点,实用性很强,而且用的好往往事半功倍,想获得力量吗,开整:

我把他们分为这几块:

  1. 链表反转:反转单向链表或双向链表。
  2. 检测链表环:判断链表中是否存在环。
  3. 合并两个有序链表:将两个有序链表合并成一个有序链表。
  4. 从链表中删除重复节点:删除链表中的重复节点。
  5. 链表排序:对链表进行排序(例如归并排序)。

下面一一用代码给出展示,代码完整,可以直接复制下来自己摸索,自己修改执行,也可以自己保留复习,话不多说,代码见:

C语言实现单向链表的高级操作

1. 链表反转
ListNode* reverse_list(ListNode* head) {ListNode* prev = NULL;ListNode* current = head;ListNode* next = NULL;while (current != NULL) {next = current->next;current->next = prev;prev = current;current = next;}return prev;
}
2. 检测链表环
int has_cycle(ListNode* head) {ListNode *slow = head, *fast = head;while (fast != NULL && fast->next != NULL) {slow = slow->next;fast = fast->next->next;if (slow == fast) {return 1;}}return 0;
}
3. 合并两个有序链表
ListNode* merge_sorted_lists(ListNode* l1, ListNode* l2) {if (!l1) return l2;if (!l2) return l1;if (l1->value < l2->value) {l1->next = merge_sorted_lists(l1->next, l2);return l1;} else {l2->next = merge_sorted_lists(l1, l2->next);return l2;}
}
4. 从链表中删除重复节点
void remove_duplicates(ListNode* head) {ListNode* current = head;while (current != NULL && current->next != NULL) {if (current->value == current->next->value) {ListNode* next_next = current->next->next;free(current->next);current->next = next_next;} else {current = current->next;}}
}
5. 链表排序(归并排序)
ListNode* sorted_merge(ListNode* a, ListNode* b) {if (!a) return b;if (!b) return a;if (a->value <= b->value) {a->next = sorted_merge(a->next, b);return a;} else {b->next = sorted_merge(a, b->next);return b;}
}void front_back_split(ListNode* source, ListNode** front, ListNode** back) {ListNode* fast = source->next;ListNode* slow = source;while (fast != NULL) {fast = fast->next;if (fast != NULL) {slow = slow->next;fast = fast->next;}}*front = source;*back = slow->next;slow->next = NULL;
}void merge_sort(ListNode** head_ref) {ListNode* head = *head_ref;if ((head == NULL) || (head->next == NULL)) {return;}ListNode* a;ListNode* b;front_back_split(head, &a, &b);merge_sort(&a);merge_sort(&b);*head_ref = sorted_merge(a, b);
}

C++实现双向链表的高级操作

1. 链表反转
void reverse_list() {DoubleListNode *temp = nullptr;DoubleListNode *current = head;while (current != nullptr) {temp = current->prev;current->prev = current->next;current->next = temp;current = current->prev;}if (temp != nullptr) {head = temp->prev;}
}
2. 检测链表环
bool has_cycle() {DoubleListNode *slow = head, *fast = head;while (fast != nullptr && fast->next != nullptr) {slow = slow->next;fast = fast->next->next;if (slow == fast) {return true;}}return false;
}
3. 合并两个有序链表
DoubleListNode* merge_sorted_lists(DoubleListNode* l1, DoubleListNode* l2) {if (!l1) return l2;if (!l2) return l1;if (l1->value < l2->value) {l1->next = merge_sorted_lists(l1->next, l2);if (l1->next != nullptr) {l1->next->prev = l1;}l1->prev = nullptr;return l1;} else {l2->next = merge_sorted_lists(l1, l2->next);if (l2->next != nullptr) {l2->next->prev = l2;}l2->prev = nullptr;return l2;}
}
4. 从链表中删除重复节点
void remove_duplicates() {DoubleListNode* current = head;while (current != nullptr) {DoubleListNode* runner = current->next;while (runner != nullptr) {if (current->value == runner->value) {DoubleListNode* next = runner->next;if (runner->prev) {runner->prev->next = runner->next;}if (runner->next) {runner->next->prev = runner->prev;}delete runner;runner = next;} else {runner = runner->next;}}current = current->next;}
}
5. 链表排序(归并排序)
DoubleListNode* sorted_merge(DoubleListNode* a, DoubleListNode* b) {if (!a) return b;if (!b) return a;if (a->value <= b->value) {a->next = sorted_merge(a->next, b);a->next->prev = a;a->prev = nullptr;return a;} else {b->next = sorted_merge(a, b->next);b->next->prev = b;b->prev = nullptr;return b;}
}void split(DoubleListNode* source, DoubleListNode** front, DoubleListNode** back) {DoubleListNode* fast = source->next;DoubleListNode* slow = source;while (fast != nullptr) {fast = fast->next;if (fast != nullptr) {slow = slow->next;fast = fast->next;}}*front = source;*back = slow->next;slow->next = nullptr;
}void merge_sort(DoubleListNode** head_ref) {DoubleListNode* head = *head_ref;if ((head == nullptr) || (head->next == nullptr)) {return;}DoubleListNode* a;DoubleListNode* b;split(head, &a, &b);merge_sort(&a);merge_sort(&b);*head_ref = sorted_merge(a, b);
}

是不是发现了一个尽分享干货的博主,创作属实不易,希望大家珍惜!

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

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

相关文章

Captura完全免费的电脑录屏软件

一、简介 1、Captura 是一款免费开源的电脑录屏软件&#xff0c;允许用户捕捉电脑屏幕上的任意区域、窗口、甚至是全屏画面&#xff0c;并将这些画面录制为视频文件。这款软件具有多种功能&#xff0c;例如可以设置是否显示鼠标、记录鼠标点击、键盘按键、计时器以及声音等。此…

JVM1.8分代的理论基础和简单测试

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…

用PHP封装一个强大且通用的CURL方法

用PHP封装一个强大且通用的CURL方法 支持&#xff1a;get、post、put、delete、patch、options 直接上代码&#xff1a; /*** function 强大且通用的cURL请求库* param $url string 路径* param $method string 请求方式 如&#x…

【Javascript】Promise形象比喻

我们可以把 Promise 形象地比喻为一个“外卖订单”&#xff0c;它有三种状态&#xff1a;下单中、已送达、已取消。这个比喻可以帮助你理解 Promise 的工作机制。 比喻解释 Pending&#xff08;下单中&#xff09;&#xff1a; 当你在外卖平台上创建一个订单时&#xff0c;订…

c 函数指针的表现形式

1.概要 int&#xff08;*函数指针变量&#xff09;(int a,char b)&#xff0c;这里的函数指针变量就可以代码一个特定类型的函数指针 int&#xff08;*&#xff09;(int a,char b)就是这种函数指针的类型 2.代码 #include <iostream>void fun() {printf("fun\n&q…

海外仓系统哪家好?闭坑指南,擦亮眼睛选对系统

可以说现在的海外仓系统市场还是比较杂乱的&#xff0c;各种不同类型&#xff0c;不同收费标准的系统比比皆是&#xff0c;这让很多想引进海外仓系统的企业不知所措&#xff0c;不知道怎么选。 今天就聊一下在选择海外仓系统的时候应该如何考量&#xff0c;才能避免被坑&#…

JS分支语句

一 三元运算符 1 语法格式&#xff1a; 条件?满足条件执行代码1:不满足条件执行代码2 2 用途 三元运算符等价于简单的if else语句&#xff0c;常用于判断取值 二 switch语句 1 语法格式&#xff1a; swtich(数据){case 值1:执行语句breakcase 值2:执行语句breakcase 值…

C++之对象的使用

1、static成员 2、static成员优点 2、static成员函数 静态成员函数不能访问非静态成员原因&#xff1a;因为没有this指针。也不可以访问非静态成员函数。 可以通过对象来访问静态成员&#xff0c;但是不推荐这么使用&#xff0c;会让人误解成这个x_是属于对象的&#xff0c;但…

贪心算法典型题目

糖果 有n个小朋友&#xff0c;有m袋糖果&#xff0c;第i袋的糖果数量是a[i]。已知n<m<2n。 每个小朋友至少要有一袋糖果&#xff0c;至多只能要两袋糖果。 分配的目标是把这m袋糖果全部分完&#xff0c;而且要使得每个小朋友最终得到的糖果数量都是相等的。 如果可以…

“大一新生接单:专业打造单页HTML网站,让你的项目脱颖而出!”

我是大一新生&#xff0c;对HTML有浓厚的兴趣&#xff0c;并且已经掌握了一些基础知识。 学会了使用htmlcss的网页设计&#xff08;暂未学JavaScript&#xff09; 如果你需要代写的服务可以在本作品下方 评论留言

PyCharm基本配置内容

如何更换 Python 解释器 输入一段代码点击运行后&#xff0c;画面下方有一个路径如图中框中所示&#xff1a; 上面的路径为虚拟路径&#xff0c;可以改为我们自己设置的路径 点击设置&#xff0c;选择settings 选择Project&#xff1a;y002———》Python Interpreter&#…

C++课程设计实验杭州电子科技大学ACM题目(中)

题目四&#xff1a;2016.数据的交换输出 题目描述 Problem Description&#xff1a; 输入n(n<100)个数&#xff0c;找出其中最小的数&#xff0c;将它与最前面的数交换后输出这些数。 Input&#xff1a;输入数据有多组&#xff0c;每组占一行&#xff0c;每行的开始是一…

python爬虫之pandas库——数据清洗

安装pandas库 pip install pandas pandas库操作文件 已知在本地桌面有一名为Python开发岗位的csv文件(如果是excel文件可以做简单修改即可&#xff0c;道理是通用的) 打开文件&#xff1a; 打开文件并查看文件内容 from pandas import DataFrame import pandas as pd data_c…

【自动驾驶技术栈学习】2-软件《大话自动驾驶》| 综述要点总结 by.Akaxi

----------------------------------------------------------------------------------------------------------------- 致谢&#xff1a;感谢十一号线人老师的《大话自动驾驶》书籍&#xff0c;收获颇丰 链接&#xff1a;大话自动驾驶 (豆瓣) (douban.com) -------------…

nuxt3+Element Plus项目搭建过程记录

背景 本文只记录项目搭建过程中遇到的一些问题和关键点&#xff0c;nuxt框架的说明和API请参照官网学习 官网&#xff1a;https://nuxt.com/docs/getting-started/introduction 1. 初始化项目 指令如下: npx nuxilatest init <project-name>我在安装过程中出现报错&a…

本地源码方式部署启动MaxKB知识库问答系统,一篇文章搞定!

MaxKB 是一款基于 LLM 大语言模型的知识库问答系统。MaxKB Max Knowledge Base&#xff0c;旨在成为企业的最强大脑。 开箱即用&#xff1a;支持直接上传文档、自动爬取在线文档&#xff0c;支持文本自动拆分、向量化、RAG&#xff08;检索增强生成&#xff09;&#xff0c;智…

AI视频智能分析技术赋能营业厅:智慧化管理与效率新突破

一、方案背景 随着信息技术的快速发展&#xff0c;图像和视频分析技术已广泛应用于各行各业&#xff0c;特别是在营业厅场景中&#xff0c;该技术能够有效提升服务质量、优化客户体验&#xff0c;并提高安全保障水平。TSINGSEE青犀智慧营业厅视频管理方案旨在探讨视频监控和视…

七人拼购新模式:革新购物体验,共创价值

在数字时代&#xff0c;消费者的购物体验正经历着前所未有的变革。七人拼购模式作为一种新兴的购物方式&#xff0c;通过汇集消费者的力量&#xff0c;实现商品价格的最优化&#xff0c;让消费者享受到前所未有的实惠与便利。以下&#xff0c;我们将以一款标价499元的商品为例&…

消防体验馆升级,互动媒体点亮安全之路!

在当下这个科技日新月异的时代&#xff0c;多媒体互动技术已深深融入现代化消防体验馆的设计之中&#xff0c;它们不仅为这些场馆注入了前所未有的创意与活力&#xff0c;更通过其互动性、趣味性等独特优势&#xff0c;彻底革新了消防宣传教育的传统模式。如今&#xff0c;这种…

边缘计算一些指标介绍

AI 性能&#xff1a; 边缘计算服务器中的AI性能参数是指用来描述服务器在进行人工智能任务时的性能表现的参数。这些参数可以包括以下几个方面&#xff1a; 计算能力&#xff1a;描述服务器处理AI任务的速度和效率。常见的指标有浮点运算能力&#xff08;FLOPS&#xff09;和图…