单链表题-ysf-反转-中间节点-回文-合并-分割

环形链表的约瑟夫问题_牛客题霸_牛客网

经典的约瑟夫环

 #include <stdint.h>
#include <stdlib.h>
//创建链表
typedef struct ListNode ListNode;ListNode* buyNode(int x){ListNode* newNode=(ListNode*)malloc(sizeof(ListNode));if(newNode==NULL){exit(1);}newNode->val=x;newNode->next=NULL;return newNode;} //创建新节点
ListNode* createList(int n){ListNode* phead=buyNode(1);ListNode* ptail=phead;for(int i=2;i<=n;i++){ptail->next=buyNode(i);ptail=ptail->next;}ptail->next=phead;return ptail;//返回ptail,因为需要有前一个指针和后一个指针}int ysf(int n, int m ) {// write code hereListNode* prev=createList(n);ListNode* pcur=prev->next;int count=1;while(pcur->next!=pcur){if(count==m){prev->next=pcur->next;//先让prev指向pcur的next要不然会找不到pcurfree(pcur);pcur=prev->next;count=1;//置为1重新计数}else{prev=pcur;pcur=pcur->next;count++;}}return pcur->val;}

. - 力扣(LeetCode)

反转链表

struct ListNode* reverseList(struct ListNode* head){if(head==NULL)
{return NULL;
}
struct ListNode* n1;
struct ListNode* n2;
struct ListNode* n3;
n1=NULL;
n2=head;
n3=head->next;while(n2)
{n2->next=n1;n1=n2;n2=n3;if(n3)n3=n3->next;}
return n1;
}

. - 力扣(LeetCode)

链表的中间节点 

struct ListNode* middleNode(struct ListNode* head) {struct ListNode*slow,*fast;;slow=fast=head;while(fast && fast->next)//不能写成while(fast->next && fast)
因为while会先判断前面的条件,而fast很可能直接就跑到空了,根本没有next属性导致报错
也就是短路性质{slow=slow->next;fast=fast->next->next;}return slow;
}



. - 力扣(LeetCode)

回文链表

核心思想:将链表反转后,比较后半部分是否相同

遍历链表找到中间节点,从中间节点为分割线去比较两边是否先相同

typedef struct ListNode ListNode;
ListNode* reverseList(ListNode* head){ListNode* n1=NULL;ListNode* n2=head;ListNode* n3=head->next;while(n2){n2->next=n1;n1=n2;n2=n3;if(n3){n3=n3->next;}}return n1;
}
bool isPalindrome(struct ListNode* head){if(head==NULL||head->next==NULL){return true;}ListNode* fast=head;ListNode* slow=head;//遍历得到中间节点while(fast->next&&fast->next->next){slow=slow->next;fast=fast->next->next;}//右半部分反转后与前半部分比较ListNode* right=reverseList(slow->next);ListNode* cur=head;while(right){if(right->val!=cur->val){return false;}else{right=right->next;cur=cur->next;}}return true;
}

. - 力扣(LeetCode)

合并两个有序链表

typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {if(list1==NULL)//如果list1为空,返回list2{return list2;}if(list2==NULL){return list1;}ListNode*head,*tail;head=tail=(ListNode*)malloc(sizeof(ListNode));while(list1&&list2)//判断循环条件,有一个为空就跳出循环{if(list1->val<list2->val)//l1<l2的值{tail->next=list1;//把list1链接到tail后面tail=tail->next;//tail迭代往后走list1=list1->next;//list1迭代往后走}else{tail->next=list2;tail=tail->next;list2=list2->next;}}if(list1){tail->next=list1;}if(list2){tail->next=list2;}ListNode* ret=head->next;free(head);head=NULL;//动态申请的空间需要手动释放return ret;
}

. - 力扣(LeetCode)

分割链表

给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。

你不需要 保留 每个分区中各节点的初始相对位置。

思路:创建两个新链表,一个放比特定值小的数,一个放大的然后链接起来;

注意事项:对于大链表中的尾节点,需要置空,要不会出现死循环;创建哨兵位,需要手动释放空间;让小链表的尾指向大链表哨兵位的next

struct ListNode* partition(struct ListNode* head, int x){
struct ListNode*lesshead,*lesstail,*greaterhead,*greatertail;
//开两个哨兵位,虚拟节点,方便尾插
lesshead=lesstail=(struct ListNode*)malloc(sizeof(struct ListNode));
lesstail->next=NULL;
greaterhead=greatertail=(struct ListNode*)malloc(sizeof(struct ListNode));
greatertail->next=NULL;
struct ListNode*cur=head;
while(cur)
{if(cur->val<x){lesstail->next=cur;lesstail=cur;}else{greatertail->next=cur;greatertail=cur;}cur=cur->next;
}
lesstail->next=greaterhead->next;
greatertail->next=NULL;
struct ListNode* newhead=lesshead->next;
free(lesshead);
free(greaterhead);
return newhead;
}

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

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

相关文章

C++ C# 贝塞尔曲线

二阶贝塞尔曲线公式 三阶贝塞尔曲线公式 C 三维坐标点 二阶到N阶源码 //二阶公式&#xff1a; FVector BezierUtils::CalculateBezierPoint(float t, FVector startPoint, FVector controlPoint, FVector endPoint) {float t1 (1 - t) * (1 - t);float t2 2 * t * (1 - t);…

关于JVM内存模型和堆内存模型的理解

文章目录 前言一、JVM 内存模型的理解1.第一部分&#xff1a;线程共享区&#xff08;堆和方法区&#xff09;2.第二部分&#xff1a;线程独占区&#xff08;程序计数器、虚拟机栈和本地方法栈&#xff09;3.JVM的几个知识点3.1 垃圾回收就指线程共享区&#xff08;堆和方法区&a…

python数据分析——数据可视化(图形绘制基础)

数据可视化&#xff08;图形绘制基础&#xff09; 前言一、图形绘制基础Matplotlib简介使用过程sin函数示例 二、常用图形绘制折线图的绘制plot示例 散点图的绘制plot示例 柱状图的绘制bar示例 箱型图绘制plot.box示例 饼状图的绘制pie示例 三、图形绘制的组合情况多个折线图的…

MacOS docker 安装与配置

orbstack 安装 官网&#xff1a; https://orbstack.dev 下载链接&#xff1a;Download OrbStack Fast, light, simple Docker Desktop alternative 选择是Apple M系列处理器&#xff0c; 或 Intel系列处理器 到这里就安装好了Orbstack软件&#xff0c;下面开始配置docker 下…

Mybatis:in中应使用${}而不是#{}

示例1: in中应使用${}而不是#{} String deviceStatus"1,2,5,7";in中使用#{} SELECT * FROM TABLE_NAME WHERE SUBSTRING_INDEX(SUBSTRING_INDEX(status, ,, 3), ,, -1) in (#{deviceStatus})查询不到数据 in中使用${} SELECT * FROM TABLE_NAME WHERE SUBSTRIN…

Python-VBA函数之旅-vars函数

目录 一、vars函数的常见应用场景 二、vars函数使用注意事项 三、如何用好vars函数&#xff1f; 1、vars函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;https://myelsa1024.blog.csdn.net/ 一、vars函数…

MySQL旧表做分区流程

1. 为什么做分区 数据库分区是将数据库中的数据划分成独立的部分&#xff0c;每个部分称为一个分区。分区可以根据特定的标准&#xff0c;如范围、列表或哈希值&#xff0c;将数据分隔到不同的物理存储位置中。数据库表分区可以在多种情况下提供显著的好处。以下是一些应该考虑…

查询中Split函数不管用?试试这个自定义函数!

hi&#xff0c;大家好&#xff01; 我们在实际的应用中会有这样的一些情况&#xff0c;获取的一些数据是由一些特殊字符连接起来的&#xff0c;比如&#xff1a;XXX汽车\SUV\EV\纯电。类似这样的数据&#xff0c;我们在应用过程中&#xff0c;需要将数据拆开&#xff0c;如果用…

是德keysight N1911A与N1913A单通道功率计

Agilent N1911A和N1912A P系列单通道和双通道功率计以及N192XA传感器可提供宽带宽和高性能测量&#xff0c;这是确保用户的产品符合其功率规范所需要的。 P系列功率计具有30MHz视频带宽和每秒100M/s 的持续采样率&#xff0c;可进行快速、准确、可重复的功率测量。当这些功…

Visual Studio环境搭载

环境搭建步骤&#xff1a; 下载软件 安装软件 运行软件 1 下载软件 在百度搜索 visual studio&#xff0c;选择 如下图中的选项 进入Visual Studio 官网后&#xff0c;选择 下载Windows版&#xff0c;并选择Community 2017 社区版本进行下载保存软件到电脑中 2 安装软件 双击…

找表是否存在mysql保留字段

SELECT column_name FROM information_schema.columns WHERE table_name 表名称AND column_name IN(action, add, aggregate, all, alter, after, and, as, asc, avg, avg_row_length,auto_increment, between, bigint, bit, binary, blob, bool, both, by, cascade, case, ch…

小米消金借势互联网消费场景,提升服务品质与效率

随着数字化时代的迅猛发展&#xff0c;消费领域正经历着巨大的变革。重庆小米消费金融有限公司&#xff08;简称“小米消金”&#xff09;&#xff0c;作为一家科创型持牌消费服务机构&#xff0c;紧跟这一浪潮&#xff0c;持续增强数字化服务能力&#xff0c;优化服务模式和用…

Focus Stacking Algorithm

Focus Stacking 对焦堆叠&#xff08;Focus Stacking&#xff09;过程中涉及的关键算法主要用于图像对齐、图像融合和图像锐化。以下是一些相关的算法和技术&#xff1a; 1. 图像对齐算法 在对焦堆叠过程中&#xff0c;图像对齐是确保每张照片的内容精确叠加的重要步骤。常用…

Delphi 高效处理大数据量的字典数据的查询问题

一、需求 系统中存在基本字典数据&#xff0c;且数据量大&#xff0c;需要根据各种条件查询某个字典数据&#xff0c;该如何高效实现&#xff1f; 例如&#xff1a;系统中的菜品字典数据&#xff0c;需要根据菜品ID、菜品编码、菜品名菜品规格等条件查找菜品 二、思路 1、使…

uview-plus在uniapp项目中单选和复选框不显示问题

在我的uniapp小程序项目中&#xff0c;我使用了vue3ts的组合&#xff0c;ui组件库使用了uview-plus这个组件库&#xff0c;但是在使用个别组件的时候&#xff0c;没有显示出效果&#xff0c;就像单选或者复选框&#xff0c;官方效果&#xff1a; 但是当我用到自己项目中的时候&…

[晕事]今天做了件晕事33 c++ mangle 函数名

作为一名c的程序员&#xff0c;开始使用c的时候&#xff0c;如果工程里同时有c和c&#xff0c;而且函数相互调用。 这个时候&#xff0c;需要注意&#xff0c; https://mzhan017.blog.csdn.net/article/details/121950739。 这个最好是在提示的时候&#xff0c;直接按照mangle…

【全开源】Java同城信息付费系统家政服务房屋租赁房屋买卖房屋装修信息发布平台小程序APP公众号源码

同城信息付费系统&#xff1a;家政服务的新篇章 在快节奏的现代生活中&#xff0c;家政服务已成为许多家庭不可或缺的一部分。然而&#xff0c;如何快速、准确地找到合适、可靠的家政服务人员&#xff0c;一直是困扰着许多家庭的问题。为了解决这一难题&#xff0c;我们推出了…

5.14号模拟前端面试10问

1. setState是同步还是异步 setState是React中用于更新组件状态的方法。在React中&#xff0c;setState可以是同步的&#xff0c;也可以是异步的&#xff0c;具体取决于调用场景和React的内部实现。 在大部分情况下&#xff0c;setState是异步的。当setState被调用时&#xf…

一图流解释Java中线程状态的转换

目录 一.Java中的几大线程状态 二.线程之间的相互转换 ▐ NEW --> RUNNABLE ▐ RUNNABLE <--> WAITING ▐ RUNNABLE <--> Timed Waiting ▐ RUNNABLE<--> BLOCKED ▐ RUNNABLE<-->TERMINATED 一.Java中的几大线程状态 简单来说线程可以处于…

PCIE协议-2-事务层规范-Message Request Rules-Vendor_Defined Messages

2.2.8.6 厂商定义消息 厂商定义消息允许扩展PCI Express消息功能&#xff0c;可以作为PCI Express规范的一般扩展&#xff0c;也可以是厂商特定的扩展。本节通用地定义了与这些消息相关的规则。 厂商定义消息&#xff08;见表2-25&#xff09;使用图2-28中显示的头标格式。re…