单链表经典算法

一,移除链表元素

思路一

遍历数组,如果遇到链表中的元素等于val的节点就执行删除操作

typedef struct ListNode ListNode;struct ListNode* removeElements(struct ListNode* head, int val) {if(head==NULL){return NULL;} ListNode*pnewhead=(ListNode*)malloc(sizeof(ListNode));pnewhead->next=head;ListNode*pcur=head;ListNode*prev=pnewhead;while(pcur){if(pcur->val==val){prev->next=pcur->next;free(pcur);pcur=NULL;pcur=prev->next;}else{prev=pcur;pcur=pcur->next;}}return pnewhead->next;}

思路二

建立一个新的链表,遇到的节点里面存的数据如果不等于val的值的话就将这个节点尾插到建立的新的链表的后面

typedef struct ListNode ListNode;struct ListNode*removeElement(struct ListNode*head,int val){ListNode*pcur=head;ListNode*newhead,*newtail;//建立新的链表newhead=newtail=NULL;while(pcur)//遍历链表{if(pcur->val!=val){if(newhead==NULL){newhead=newtail=pcur;//新链表为空,将当前的节点赋值给新的链表}else{newtail->next=pcur;//不为空,插到新链表的后面newtail=newtail->next;}}pcur=pcur->next;}if(newtail)//如果链表的不为空的话,就让尾节点的后面为空{newtail->next=NULL;}return newhead;}

代码说明

 if(newtail)//如果链表的不为空的话,就让尾节点的后面为空{newtail->next=NULL;}

因为链表在插入的时候,当前节点的后面还有节点,插入的时候会后面的节点会跟在后面,所以要将原链表的尾节点的后面的节点置为空,比如下面的

当要将上面的链表中的4处于的节点的位置插入到下面0位于的节点的后面,插入的不是4,而是4和4链接的5位于的节点,插入的是后面的一串,这和顺序表不一样 

二.反转链表

思路

这里可以定义三个指针,一个指向当前节点,一个指向当前节点的上一个节点,一个指向当前节点的下一个节点,直接让当前节点指向上一个节点

typedef struct ListNode ListNode;
struct ListNode* reverseList(struct ListNode* head) {ListNode*prev=NULL;//前驱节点ListNode*pcur=head;//当前节点ListNode*back=NULL;//当前节点的下一个节点if(head==NULL){return NULL;}if(head->next==NULL){return head;}while(pcur){pcur->next=prev;prev=pcur;pcur=back;if(back!=NULL){back=back->next;}}return prev;
}

三.将两个升序链表合并成为一个新的升序链表

思路:定义一个新的无效链表头(里面没有数据,在后续的程序中不需要判断该链表是否是空链表,能够对代码进行优化,有返回值的时候直接返回这个链表头的下一个节点就可以了),以及两个指针,分别指向两个升序链表,比较两个链表里面的值,谁小就把谁放到新链表的后面,然后这个指针指向下一个节点就行了

typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {ListNode*pcur1=list1;//定义指针1ListNode*pcur2=list2;//定义指针2if(list1==NULL){return list2;//为空链表的话返回另一个链表}if(list2==NULL){return list1;//为空的话返回另一个链表}ListNode*phead=(ListNode*)malloc(sizeof(ListNode));ListNode*pcur3=phead;while(pcur1&&pcur2){if(pcur1->val<=pcur2->val){pcur3->next=pcur1;pcur3=pcur3->next;pcur1=pcur1->next;}else{pcur3->next=pcur2;pcur3=pcur3->next;pcur2=pcur2->next;}}if(pcur2==NULL){pcur3->next=pcur1;//插入的是该节点以及该节点后面的节点,一步到位}if(pcur1==NULL){pcur3->next=pcur2;}return phead->next;}

四.链表的中间节点

思路:定义两个指针,一个快指针,一个慢指针,满指针一次走一格,快指针一次走两格,最后返回慢指针就行了

typedef struct ListNode ListNode;
struct ListNode* middleNode(struct ListNode* head) {ListNode*fast,*slow;fast=head,slow=head;if(head->next==NULL){return head;}while(fast&&fast->next){slow=slow->next;fast=fast->next->next;}return slow;}

五,分割链表

思路:定义两个新的链表,遍历原链表,原链表里面的节点里面的值和x比较,小的尾插在第一个链表后面,大于等于的尾插在第二个链表的后面,最后连接两个链表

typedef struct ListNode ListNode;
struct ListNode* partition(struct ListNode* head, int x){ListNode*pcur=head;ListNode*pcur1=(ListNode*)malloc(sizeof(ListNode));ListNode*pcur2=(ListNode*)malloc(sizeof(ListNode));ListNode*head1=pcur1;ListNode*head2=pcur2;if(head==NULL){return NULL;}if(head->next==NULL){return head;}while(pcur){if(pcur->val<x){pcur1->next=pcur;pcur1=pcur1->next;}else{pcur2->next=pcur;pcur2=pcur2->next;}pcur=pcur->next;}pcur2->next=NULL;pcur1->next=head2->next;return head1->next;
}

 注意:上面的代码为什么要有下面的这句话嘞?

pcur2->next=NULL;

 原因是插入链表节点的时候,后面带着的节点是跟在本节点的后面的,插的时候就顺带着了,本节点后面不置为空就会造成死循环

六.环形链表的约瑟夫问题 

什么是环形链表的约瑟夫问题,先看一看下面的故事:

著名的Josephus问题 据说著名犹太 历史学家 Josephus有过以下的故事:在罗⻢⼈占领乔塔帕特后,39个犹太⼈与 Josephus及他的朋友躲到⼀个洞中,39个犹太⼈决定宁愿死也不要被⼈抓到,于是决定了⼀个⾃杀 ⽅式,41个⼈排成⼀个圆圈,由第1个⼈开始报数,每报数到第3⼈该⼈就必须⾃杀,然后再由下⼀ 个重新报数,直到所有⼈都⾃杀⾝亡为⽌。 然⽽Josephus和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与⾃⼰安排在 第16个与第31个位置,于是逃过了这场死亡游戏。

第一步:创建一个环形链表

第二部:定义一个变量,初值为1,如果该变量不等于m,该变量加1,继续遍历链表,等于,删除该节点,变量重新等于1

typedef struct ListNode ListNode;
//产生一个节点ListNode*buynode(int x){ListNode*newnode=(ListNode*)malloc(sizeof(ListNode));newnode->val=x;newnode->next=NULL;return newnode;}
//建立一个环形链表ListNode*creatcircle(int n){ListNode*phead=buynode(1);ListNode*pcur=phead;phead->val=1;for(int i=2;i<=n;i++){pcur->next=buynode(i);pcur=pcur->next;}pcur->next=phead;return phead;}
int ysf(int n, int m ){ListNode*phead=creatcircle(n);ListNode*pcur=phead;ListNode*prev=NULL;int count=1;while(pcur->next!=pcur){if(count==m){prev->next=pcur->next;free(pcur);pcur=NULL;count=1;pcur=prev->next;}else {prev=pcur;pcur=pcur->next;count++;}}return pcur->val;
}

七.结语

在链表中,最值得注意的是,尾插链表,插入的是该节点和该节点后面的节点,也就是一串节点

在插入链表的时候,记得要将该节点后面置为空

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

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

相关文章

大数据之数据仓库技术:ETL工具和Kettle简介

大数据之数据仓库技术&#xff1a;ETL工具和Kettle简介 ETL简介ETL工具和KettleKettle家族 Kettle资源KettlePack 任务调度工具 ETL简介 ETL(Extract-Transform-Load): 在大数据技术领域内&#xff0c;用来描述将数据从 来源端 经过 抽取(extract), 转换(transform), 加载(loa…

【Vue】结合ElementUI实现简单数据请求和页面跳转功能

一、准备工作 1、创建一个Vue-cli程序 之前的博客有。各位看官姥爷&#xff0c;可以自查。 2、安装ElementUI 在创建Vue-cli程序的过程中&#xff0c;需要在控制台执行以下指令&#xff1a; #安装 element-ui npm i element-ui -S #安装 SASS 加载器 cnpm install sass-loa…

毫米波雷达多人呼吸心跳检测MATLAB仿真

本文基于TI的IWR1642毫米波雷达 2T4R MIMO阵列&#xff0c;通过实际采集数据算法仿真&#xff0c;实现多人呼吸心跳检测。 文章末尾给出了本文的仿真代码。 主要内容包含&#xff1a; &#xff08;1&#xff09;雷达参数设定 &#xff08;2&#xff09;ADC数据导入 &#xff08…

一对一WebRTC视频通话系列(一)—— 创建页面并显示摄像头画面

本系列博客主要记录WebRtc实现过程中的一些重点&#xff0c;代码全部进行了注释&#xff0c;便于理解WebRTC整体实现。 一、创建html页面 简单添加input、button、video控件的布局。 <html><head><title>WebRTC demo</title></head><h1>…

【算法基础实验】图论-深度优先搜索和深度优先路径

深度优先(DFS) 理论基础 深度优先搜索&#xff08;DFS, Depth-First Search&#xff09;是图和树的遍历算法中的一种&#xff0c;它从一个节点开始&#xff0c;沿着树的边走到尽可能深的分支&#xff0c;直到节点没有子节点为止&#xff0c;然后回溯继续搜索下一个分支。DFS …

ubuntu外置网卡配置AP模式

外置网卡RTL8811CU设置 UBUNTU使用RTL8811CU网卡&#xff08;包含树莓派&#xff09; 外置网卡配置AP模式流程 1. 检查网卡支持情况&#xff08;是否支持AP模式&#xff09; iw list找到以上部分&#xff0c;发现支持AP 2. 安装依赖 sudo apt-get update sudo apt-get in…

c语言从入门到函数速成(1)

温馨提醒&#xff1a;本篇文章适合人群&#xff1a;刚学c又感觉那个地方不怎么懂的同学以及以及学了一些因为自身原因停学一段时间后又继续学c的同学 好&#xff0c;正片开始。 主函数 学c时最先学的是我们c语言程序的主体函数&#xff0c;c的主函数有两种写法&#xff0c;这…

25 JavaScript学习:var let const

JavaScript全局变量 JavaScript中全局变量存在多种情况和定义方式&#xff0c;下面详细解释并提供相应的举例&#xff1a; 使用var关键字声明的全局变量&#xff1a; var globalVar "我是全局变量";未使用var关键字声明的变量会成为全局变量&#xff08;不推荐使用&…

【御控物联网平台】物联网数据传输数据格式

物联网平台常用设备消息的标准数据格式为JSON&#xff0c;但是不同厂家、不同型号设备数据传输格式各异&#xff0c;给物联网平台带来数据解析的压力。御控物联网平台提供支持JSON数据消息解析功能的代码库&#xff08;JS、Java、.Net&#xff09;&#xff0c;实现设备自定义JS…

八大排序详解:动图、代码、注释

目录 何为八大排序&#xff1f; 直接插入排序 排序过程解读 直接插入排序的特性总结&#xff1a; 希尔排序 希尔排序的特性总结&#xff1a; 直接选择排序 直接选择排序的特性总结&#xff1a; 堆排序 直接选择排序的特性总结&#xff1a; 冒泡排序 快速排序 1.Hoa…

初学React基础

最近准备跟着黑马React学一下React&#xff0c;扩充一下技术面&#xff0c;打算还是以一边学习一边记笔记为主&#xff0c;进行学习&#xff01; 1. React介绍 1.1. React是什么&#xff1f; React是由FaceBook现在称&#xff08;Meta&#xff09;开发的开源 JavaScript 库&a…

【leetcode】数组和相关题目总结

1. 两数之和 直接利用hashmap存储值和对于索引&#xff0c;利用target-nums[i]去哈希表里找对应数值。返回下标。 class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> mp;vector<int> res;fo…

【linux】进程间通信(匿名管道)

对于本篇文章我们采取三段论&#xff1a;是什么 为什么 怎么办。 目录 进程间为什么要通信&#xff1f;进程间如何通信&#xff1f;进程间怎么通信&#xff1f;匿名管道&#xff1a;匿名管道原理&#xff1a;代码示例&#xff1a;匿名管道的情况与特征&#xff1a; 进程间为什…

win下vscode的vim切换模式的中英文切换

问题描述 在vscode中安装vim插件后&#xff0c;如果insert模式下完成输入后&#xff0c;在中文输入方式下按esc会发生无效输入&#xff0c;需要手动切换到英文。 解决方法 下载完成vscode并在其中配置vim插件下载github—im-select.exe插件&#xff08;注意很多博文中的gitcod…

【MySQL篇】使用mysqldump全量+mysqlbinlog增量完成实例的全库恢复(第四篇,总共四篇)

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&am…

每天五分钟深度学习框架pytorch:如何创建多维Tensor张量元素?

本文重点 上节课程我们学习了如何创建Tensor标量,我们使用torch.tensor。本节课程我们学习如何创建Tensor向量,我们即可以使用torch.Tensor又可以使用torch.tensor,下面我们看一下二者的共同点和不同点。 Tensor张量 tensor张量是一个多维数组,零维就是一个点(就是上一…

【数据结构】链表专题3

前言 本篇博客我们继续来讨论链表专题&#xff0c;今天的链表算法题是经典中的经典 &#x1f493; 个人主页&#xff1a;小张同学zkf ⏩ 文章专栏&#xff1a;数据结构 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 目录 1.判断链表是否…

ROS1快速入门学习笔记 - 014launch启动文件的使用方法

一、定义 Launch文件&#xff1a;通过XML文件实现多节点的配置和启动&#xff08;可自动启动ROSMaster&#xff09; 二、常用语法 1. 根标签 <launch> - launch文件中的根元素采用<launch>标签定义 <launch>表示开始&#xff1b;<launch>表示结束&…

AD | Altium Designer(原理图设计、电路仿真、PCB绘图)汉化版

Altium Designer(原理图设计、电路仿真、PCB绘图) 通知公告 Altium Designer(AD)是一种功能强大的电子设计自动化(EDA)软件。它主要用于设计和开发电子产品,如电路板(PCB)、集成电路(IC)和嵌入式系统。AD提供了完整的设计工具套件,包括原理图设计、PCB布局、仿真、设…

40.WEB渗透测试-信息收集-域名、指纹收集(2)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;39.WEB渗透测试-信息收集-域名、指纹收集&#xff08;1&#xff09; oneforall的安装前置…