C语言进阶|链表经典OJ题

✈移除链表元素

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

方法一:

遍历链表找到所有等于val的节点,再执行删除操作删除这些节点。

方法二:

双指针

创建两个指针,一个在前,一个在后。

如果前面的指针指向的元素等于val,将后面的指针连上前面指针的下一个指针,前面的指针向前走一格;

如果前面的指针指向的元素不等于val,那么两个指针都向前走一格。

再处理一些特殊情况:

struct ListNode* removeElements(struct ListNode* head, int val) {ListNode * last = head;ListNode* tmp = head;if (last == NULL || (last->next == NULL && last->val == val))//如果是空链表或只有一个val的链表{return NULL;}else if (last->next == NULL)//如果只有一个节点且不等于val的链表{return head;}else{while (tmp != NULL){if (tmp == last){tmp = tmp->next;}if (tmp->val==val){last->next = tmp->next;tmp = tmp->next;}else{last = last->next;tmp = tmp->next;}}if (head->val == val)//如果第一个节点的元素就等于val{return head->next;}last->next = NULL;}return head;
}

原题链接: 

移除链表元素

✈反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

双指针法:

 创建两个指针,一个在前,一个在后。

每次循环,将前面的指针指向的链表指向在后面的指针,后面的指针赋值成前一个,前一个往下走一格。

struct ListNode* reverseList(struct ListNode* head) {if (head == NULL || head->next == NULL)//如果只有一个或者没有节点{return head;}ListNode* pre = head->next;head->next = NULL;while (pre != NULL){ListNode* tmp = pre->next;pre->next = head;head = pre;pre = tmp;}return head;
}

原题链接:

反转链表

✈合并两个有序链表

双指针法:

创建三个指针,一个指向第一个链表,一个指向第二个链表,一个指向新链表的末尾。

如果第一个指针指向的元素比第二个指针小,那么就让新链表的末尾指向第一个指针,第一个指针再向后移一格,第三个指针向后移一格;
如果第二个指针指向的元素比第一个指针小,那么就让新链表的末尾指向第二个指针,第二个指针再向后移一格,第三个指针向后移一格。
 

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {if (list1 == NULL)//先解决其中存在空链表的情况{return list2;}else if (list2 == NULL){return list1;}else{ListNode* pre = NULL;ListNode* finnal = NULL;if (list1->val <= list2->val)//初始化pre,确定新链表的的头节点finnal{finnal = list1;pre = list1;list1 = list1->next;}else{finnal = list2;pre = list2;list2 = list2->next;}while (list1 != NULL && list2 != NULL)//取元素到新的链表中{if (list1->val <= list2->val){pre->next = list1;pre = list1;list1 = list1->next;}else{pre->next = list2;pre = list2;list2 = list2->next;}}if (list1 == NULL){pre->next = list2;}else{pre->next = list1;}return finnal;}
}

原题链接: 

合并两个有序链表

✈链表的中间节点

快慢指针法:

创建两个指针,一个快指针,一个慢指针,两个指针初始值为链表的起点。快指针每次走两格,慢指针每次走一格。

如果链表中有奇数个节点,当快指针的下一个节点为NULL时,慢指针走到中间节点的位置;

如果链表中有偶数个节点,当快指针为NULL时,慢指针走到中间节点的位置。

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

原题链接:

链表的中间节点

✈环形链表的约瑟夫问题

环形链表法:

创建一个n个节点的环形链表,并且第n个节点的存储的元素是n。

删去第m个的值,并且循环n-1次。

typedef struct ListNode {int val;struct ListNode* next;
}ListNode;int ysf(int n, int m) {ListNode* head = (ListNode*)malloc(sizeof(ListNode));assert(head);head->val = 1;head->next = head;ListNode* pre = head;for (int i = 2; i <=n; i++){ListNode* newnode = (ListNode*)malloc(sizeof(ListNode));newnode->next = head;newnode->val = i;pre->next = newnode;pre = newnode;}for (int i = 0; i < n - 1; i++){for (int j = 0; j < m-1; j++){pre = pre->next;}pre->next = pre->next->next;}return pre->val;
}

 原题链接:

环形链表的约瑟夫问题

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

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

相关文章

算法必备数学基础:图论方法由浅入深实践与应用

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打怪升级之旅 python数据分析…

深度探索DreamFusion:AI和3D建模的革命

在人工智能技术迅猛发展的今天&#xff0c;DreamFusion代表了一个新的突破&#xff0c;它是一种将文本描述转化为3D模型的技术。本文旨在详细解读DreamFusion的工作原理、应用场景以及它如何改变3D建模和视觉艺术领域。 一、DreamFusion简介 DreamFusion是一种结合了深度学习…

自动化密码填充:使用Python提高日常工作效率

密码是我们日常生活中难以逃脱的一部分。从解锁电脑到登录各种服务&#xff0c;我们需要记住无数的密码。幸运的是&#xff0c;通过Python和一些有用的库&#xff0c;我们可以简化填入密码的过程&#xff0c;使日常任务自动化变得简单。在本文中&#xff0c;我们将探讨如何使用…

SparkSQL---简介及RDD V.S DataFrame V.S Dataset编程模型详解

一、SparkSQL简介 SparkSQL&#xff0c;就是Spark生态体系中的构建在SparkCore基础之上的一个基于SQL的计算模块。SparkSQL的前身不叫SparkSQL&#xff0c;而叫Shark&#xff0c;最开始的时候底层代码优化&#xff0c;sql的解析、执行引擎等等完全基于Hive&#xff0c;总之Sha…

JimuReport报表源码反编译运行遇到的问题汇总

由来:突然有一天,发现使用jimu报表工具接入功能的时候很简单,能做出来简单、复杂、主子报表等一系列,然后发问有没有一种可能拿到源码?带着这种可能我们进入下面的操作。 1、环境准备 jimureport-spring-boot-starter:1.7.0 jar包 官方版本:GitHub - jeecgboot/JimuRe…

2024年水资源保护盛事,“澜湄周”邀请国信华源加入!

4月26日&#xff0c;2024年水资源领域“澜湄周”活动在北京举行。水利部国科司、外交部亚洲司和边海司、湄公河五国驻华使馆以及澜湄水资源合作单位的代表嘉宾出席活动。北京国信华源公司特邀参加&#xff0c;现场就深化澜湄水资源合作展开深入交流研讨。 澜湄六国&#xff0c;…

2022-2003年上市公司企业商业信用融资数据

01、数据简介 企业商业信用融资是指企业之间在买卖商品时&#xff0c;以商品形式提供的借贷活动。这种融资方式是经济活动中一种最普遍的债权债务关系。商业信用的存在对于扩大生产和促进流通起到了十分积极的作用&#xff0c;但不可避免的也存在着一些消极的影响。 测算方式…

使用 LooperPrinter 监控 Android 应用的卡顿

在 Android 开发中&#xff0c;主线程&#xff08;UI线程&#xff09;的卡顿直接影响用户体验。LooperPrinter 是一种有效的工具&#xff0c;可以帮助我们监测和识别这些卡顿。下面是如何实现 LooperPrinter 监控的详细步骤和相应的 Kotlin 代码示例。 步骤 1: 创建自定义的 P…

knife4j springboot3

1.导入依赖 <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId><version>4.5.0</version></dependency> 2.配置类 package com.tigeriot.cloudser…

牛客JZ47 礼物的最大价值【中等 动态规划 C++/Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/2237b401eb9347d282310fc1c3adb134 思路 动态规划&#xff1a; 每个单元格依赖于他的上边a和左边b&#xff0c;单元格的值为max(a,b)自己的值参考答案C class Solution {public:/*** 代码中的类名、方法名、参…

京东web京东,m端滑块,h5st4.2,4.3,4.7

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx a15018601872 本文章未…

力扣33. 搜索旋转排序数组

Problem: 33. 搜索旋转排序数组 文章目录 题目描述思路复杂度Code 题目描述 思路 1.初始化左右指针&#xff1a;首先&#xff0c;定义两个指针left和right&#xff0c;分别指向数组的开始和结束位置。 2.计算中间值&#xff1a;在left和right之间找到中间位置mid。 3.比较中间值…

strstr,strnstr函数详解

strstr函数 strstr函数是C语言中的一个字符串函数&#xff0c;用于在一个字符串中查找另一个字符串的出现位置。 它的函数原型如下&#xff1a; char *strstr(const char *haystack, const char *needle); 在这个函数中&#xff0c;haystack表示被搜索的字符串&#xff0c;…

【MHA】MySQL高可用MHA介绍2-安装,配置,要求与限制

目录 一 快速开始 简单故障转移 1 构建普通的复制环境 2 在host1-host4上安装MHA Node 3 在host4(manager_host)上安装MHA Manager 4 创建配置文件 5 检查SSH连接 6 检查复制配置 7 启动manager 8 检查manager状态 9 停止manager 10 测试主故障转移 11 下一步 二…

Vue3的新组件<Suspense>

在 Vue 3 中&#xff0c;你可以使用 <Suspense> 组件来包裹异步组件&#xff0c;从而提供一个更好的用户体验&#xff0c;包括在组件加载时的占位符和加载失败时的错误提示。<Suspense> 是 Vue 3 提供的一个新特性&#xff0c;允许你指定加载异步组件时的默认内容和…

IP路由安全:保护网络免受威胁

目录 前言 一 IPv4 协议及其安全性分析 IPv4 安全问题&#xff1a; 增强 IPv4 安全性的策略&#xff1a; 二 IPsec&#xff1a;增强 IP 通信安全 1.IPsec 工作原理&#xff1a; 2.IPsec 用例&#xff1a; 3.AH协议 AH 协议工作原理 AH 协议的工作原理高级概述 AH 协议…

深入理解 Python 中的 zip 函数

目录 一、zip 函数的基础用法 二、处理不等长的可迭代对象 三、使用 * 运算符进行解压 四、在并行迭代中使用 zip 五、zip 与字典 六、高级示例 同时遍历多个列表 使用 zip 创建字典的进阶用法 利用 zip 进行数据筛选 &#x1f680; 个人主页&#xff1a;xmp65535 &a…

【多态】有关多继承和菱形继承的多态

博主首页&#xff1a; 有趣的中国人 专栏首页&#xff1a; C进阶 其它专栏&#xff1a; C初阶 | 初阶数据结构 | Linux 博主会持续更新 本篇文章主要讲解 多继承和菱形继承的多态 的相关内容 文章目录 1. 回顾多态底层2. 抽象类2.1 概念2.2 接口继承和实现继承 3. 虚表所在…

数学小报4 - 三次方程的求根公式 Quadratic Formula

数学小报4 - 三次方程的求根公式 Quadratic Formula 0. 前言 完整内容同步发表于 https://blog.csdn.net/Mr_Azz/article/details/135443217 由于证明量过于巨大&#xff0c;部分证明简化&#xff0c;详情请见网址。 1. 思考 我们学习过一元二次方程的求根公式 x − b …

05.Vue2.x 数据代理

文章目录 Vue中的数据代理 Vue中的数据代理 !<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>数…