单链表题-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.hqwc.cn/news/703110.html

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

相关文章

【Linux取经路】进程通信之匿名管道

文章目录 一、进程间通信介绍1.1 进程间通信是什么&#xff1f;1.2 进程间通信的目的1.3 进程通信该如何实现 二、管道2.1 匿名管道2.1.1 站在文件描述符角度深入理解管道2.1.2 接口使用2.1.3 PIPE_BUFFER 和 Pipe capacity2.1.4 管道中的四种情况2.1.5 管道特征总结 2.2 匿名管…

ORACLE ODAX9-2的一个误告警Affects: /SYS/MB的分析处理

在运维的多套ORACLE ODAX9-2版本&#xff0c;都遇到了一个计算节点的告警&#xff1a;Description: The service Processor poweron selftest has deteced a problem. Probabity;:100, UulD:cd1ebbdf-f099-61de-ca44-ef646defe034, Resource:/SYS/MB,&#xff1b;此告警从描述上…

优雅草便民工具v2.0.3更新

优雅草便民工具v2.0.3更新 2024年5月13日v2.0.3更新优雅草便民工具youyacao-tools-界面大改版增强用户体验 apk下载 https://fenfacun.youyacao.com/tools203.apk 介绍 优雅草便民工具是一款由成都市一颗优雅草科技有限公司打造的便民查询公益工具&#xff0c;2024年1月17…

202009青少年软件编程(Python)等级考试试卷(三级)B卷

第 1 题 【单选题】 关于利用CSV模块对文件进行操作,下列描述不正确的是&#xff1f; A :CSV是一种常用的文本格式,使用逗号分隔值的 B :CSV模块是Python的内置模块,包含很多函数,可以非常方便地读取和写入数据 C :由于CSV模块是Python的内置模块,所以可直接使用,无需引入 …

【全开源】国际版JAVA同城服务美容美发到店服务上门服务系统源码支持Android+IOS+H5

国际版同城服务美容美发到店与上门服务系统&#xff1a;一站式打造美丽新体验 随着人们生活水平的提高和审美观念的升级&#xff0c;美容美发服务已成为人们日常生活中不可或缺的一部分。为了满足全球消费者的多样化需求&#xff0c;我们推出了“国际版同城服务美容美发到店与…

力扣98.验证二叉搜索树

法一&#xff08;自己思路&#xff0c;复杂了&#xff09;&#xff1a; from collections import dequeclass Solution(object):def isValidBST(self, root):""":type root: TreeNode:rtype: bool"""queue deque()if root.left!None:queue.app…

男士内裤什么牌子的好?五大质量出众男士内裤汇总

许多男性朋友在挑选男士内裤时&#xff0c;常常因市场上琳琅满目的品牌和多样化的材质而感到困惑&#xff0c;不知从何下手。然而&#xff0c;选择男士内裤并非一件小事&#xff0c;它关乎着舒适感、透气性以及抗菌效果等多方面的体验。因此&#xff0c;在选购男士内裤时&#…

线性/非线性最小二乘 与 牛顿/高斯牛顿/LM 原理及算法

最小二乘分为线性最小二乘和非线性最小二乘 最小二乘目标函数都是min ||f(x)||2 若f(x) ax b&#xff0c;就是线性最小二乘&#xff1b;若f(x) ax2 b / ax2 bx 之类的&#xff0c;就是非线性最小二乘&#xff1b; 1. 求解线性最小二乘 【参考】 2. 求解非线性最小二乘…

并发问题系统学习

进程、线程 进程&#xff1a;进程是代码在数据集合上的一次运行活动&#xff0c;是系统进行资源分配和调度的基本单位。可以理解为一个java应用。 线程&#xff1a;线程是进程的一个执行路径&#xff0c;一个进程中至少有一个线程&#xff0c;进程中的多个线程共享进程的资源。…

易基因: WGBS等揭示梨驯化和改良过程中DNA甲基化对果实成熟的作用机制 | 作物育种

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 梨&#xff08;Pyrus ssp.&#xff0c;蔷薇科杏仁核亚科&#xff09;是世界上最重要的温带水果作物之一。与野生梨相比&#xff0c;栽培梨的果实在许多形态特征上表现出显著变化&#xf…

出国旅游常用英语,柯桥成人英语培训

Where can I catch a taxi?哪里我可以叫到出租车&#xff1f; The taxi zone is right on the left corner over there.出租车站台就在左边转角处。 Are you free?您有空吗&#xff1f; Sure. Where are you going?当然。您要去哪里&#xff1f; Drive me back to Santa …

【邮件签名证书】基于公钥基础设施的数字证书

邮件签名证书&#xff0c;也称为S/MIME&#xff08;Secure/Multipurpose Internet Mail Extensions&#xff09;证书&#xff0c;是一种基于公钥基础设施&#xff08;PKI&#xff09;的数字证书&#xff0c;专门用于验证电子邮件发送者的身份并保证邮件内容未被篡改。它通过在邮…