leetcode以及牛客网单链表相关的题、移除链表元素、链表的中间节点、合并两个有序链表、反转链表、链表分割、倒数第k个节点等的介绍

文章目录

  • 前言
  • 一、移除链表元素
  • 二、链表的中间节点
  • 三、合并两个有序链表
  • 四、反转链表
  • 五、链表分割
  • 六、倒数第k个节点
  • 总结


前言

leetcode以及牛客网单链表相关的题、移除链表元素、链表的中间节点、合并两个有序链表、反转链表、链表分割、倒数第k个节点等的介绍


一、移除链表元素

在这里插入图片描述


/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode ListNode;
struct ListNode* removeElements(struct ListNode* head, int val) {ListNode* newhead = NULL;ListNode* newtail = NULL;ListNode* cur = head;while(cur){if(cur->val != val){if(newhead == NULL){newhead = newtail = cur;}else{newtail->next = cur;newtail = newtail->next;}cur = cur->next;}else{ListNode* next = cur->next;free(cur);cur = next;}}if(newtail)newtail->next = NULL;return newhead;
}
  • 遍历链表,若节点的值不等于给定的值,则尾插到新链表后面。
  • 若等于,则跳过。

二、链表的中间节点

在这里插入图片描述


/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode ListNode;
struct ListNode* middleNode(struct ListNode* head) {ListNode* fast = head, *slow = head;while(fast != NULL && fast->next != NULL){fast = fast->next->next;slow = slow->next;}return slow;}
  • 快慢指针
  • 快指针一次走两步。
  • 慢指针一次走一步。
  • 当快指针节点为空或者下一个节点为空时,跳出循环。
  • 此时慢指针指向中间节点。

三、合并两个有序链表

在这里插入图片描述


/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {if(list1 == NULL &&list2 == NULL){return NULL;}ListNode* newHead , *newTail;newHead = newTail = NULL;while(list1 != NULL && list2 != NULL){if(list1->val > list2->val){if(newHead == NULL){newHead = newTail = list2;}else{newTail->next = list2;newTail = newTail->next;}list2 = list2->next;}else{if(newHead == NULL){newHead = newTail = list1;}else{newTail->next = list1;newTail = newTail->next;}list1 = list1->next;}}if(list1 == NULL){if(newHead == NULL)newHead = list2;elsenewTail->next = list2;}else{if(newHead == NULL)newHead = list1;elsenewTail->next = list1;}return newHead;
}
  • 遍历两个单链表。
  • 两个链表都不为空,判断节点大小,将小点节点尾插到新的头节点上。
  • 若有一个链表为空,跳出循环,并将另一个链表尾插到新的尾节点上。

四、反转链表

在这里插入图片描述


/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode ListNode;
struct ListNode* reverseList(struct ListNode* head) {if(head == NULL)return NULL;ListNode* n1, *n2, *n3;n1 = NULL;n2 = head;n3 = head->next;while(n2){n2->next = n1;n1 = n2;n2 = n3;if(n3)n3 = n3->next;}return n1;
}
    1. 将每个节点的next指向前一个节点。
    1. 创建一个新的头节点,遍历链表进行头插。

五、链表分割

在这里插入图片描述


/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};*/
class Partition {
public:ListNode* partition(ListNode* pHead, int x) {struct ListNode* gGuard, *gTail, *lGuard, *lTail;gGuard = gTail = (struct ListNode*)malloc(sizeof(struct ListNode));lGuard = lTail = (struct ListNode*)malloc(sizeof(struct ListNode));gGuard->next = lGuard->next = NULL;struct ListNode* cur = pHead;while(cur){if(cur->val < x){lTail->next = cur;lTail = lTail->next;}else {gTail->next = cur;gTail = gTail->next;}cur = cur->next;}lTail->next = gGuard->next;gTail->next = NULL;pHead = lGuard->next;free(gGuard);free(lGuard);return pHead;}
};
  • 创建两个带有哨兵位的单向链表。
  • 若小于给定值尾插到小的链表中。
  • 若大于等于给定值尾插到大的链表中。
  • 再将小链表的尾节点的next指向大链表的第一个有效节点。
  • 最后再将大链表的尾节点的next指向NULL。

六、倒数第k个节点

输入一个链表,输出该链表中倒数第k个结点。

#include <stdio.h>
#include <stdlib.h>typedef struct ListNode
{int val;struct ListNode* next;
}ListNode;ListNode* FindKthToTail(ListNode* pListHead, int k)
{if (pListHead == NULL){return NULL;}ListNode* fast, * slow;fast = slow = pListHead;int i = 0;for (i = 1; i < k; i++){fast = fast->next;if (fast == NULL){return NULL;}}while (fast->next != NULL){fast = fast->next;slow = slow->next;}return slow;
}int main()
{ListNode* phead = (ListNode*)malloc(sizeof(ListNode));ListNode* n2 = (ListNode*)malloc(sizeof(ListNode));ListNode* n3 = (ListNode*)malloc(sizeof(ListNode));ListNode* n4 = (ListNode*)malloc(sizeof(ListNode));ListNode* n5 = (ListNode*)malloc(sizeof(ListNode));phead->val = 1;n2->val = 2;n3->val = 3;n4->val = 4;n5->val = 5;phead->next = n2;n2->next = n3;n3->next = n4;n4->next = n5;n5->next = NULL;ListNode* plist = phead;ListNode* ret = FindKthToTail(plist,5);while (ret){printf("%d->", ret->val);ret = ret->next;}printf("NULL\n");return 0;
}
  • 倒数第k个和倒数第一个之间的距离是k-1.
  • 所以使用快慢指针,将快的指针先走k-1步,此时快慢指针差距是k-1.
  • 所以当快指针走到链表结尾时,慢指针走到倒数第k个节点。

总结

leetcode以及牛客网单链表相关的题、移除链表元素、链表的中间节点、合并两个有序链表、反转链表、链表分割、倒数第k个节点等的介绍

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

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

相关文章

扫盲:如何提升医学图像分割性能-to do list

导读&#xff1a;本文主要讨论了如何改进图像分割项目中的分割性能&#xff0c;包括一般性和具体性的问题解决方案&#xff0c;以及如何通过调整模型参数、改善数据集质量、优化模型架构、调整超参数、增加训练时长、改善图像分辨率和后处理技术等方法来提高分割效果。 图像分…

拼多多暂时超越阿里成为电商第一

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 拼多多的财报又炸裂了&#xff1a; 拼多多发布了第一季度财报&#xff0c;营收868亿&#xff0c;增长了131%&#xff0c;净利润279亿&#xff0c;增长了246%&#xff0c;营销服务收入424亿&#xff0c;也就是商家的…

小林coding笔记

MySQL执行流程 MySQL 的架构共分为两层&#xff1a;Server 层和存储引擎层。Server 层负责建立连接、分析和执行 SQL。存储引擎层负责数据的存储和提取。 Mysql执行 启动Mysql net start mysql登陆 mysql -u root -p输入密码

SwiftUI中的动画.animation和withAnimation

动画是通过改变视图的状态来给视图添加平滑视图变化的能力。SwiftUI中有两种类型的动画:隐式动画和显式动画。 不管是哪种动画&#xff0c;我们都需要一个被State包装的状态属性值&#xff0c;通过这个值的改变来促使与之相关的UI刷新&#xff0c;继而执行动画。 隐式动画.ani…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-19讲 串口实验UART

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

Vivado IP核的快速入门 官方手册和例程

在IP Catalog中选择要使用的IP核&#xff0c;可以查看支持的器件与资料。 在设计源sources页面中选中配置完成的IP核点击右键选择 Open IP Example Design&#xff0c;等待工程加载完成即可&#xff0c;可以点击Run Simulation进行功能仿真进行IP核的学习。 参考&#xff1…

Mac Pro中的开源虚拟机UTM安装ubuntu(Applce M1,M2芯片)(1)

MacPro安装UTM 1 UTM 下载UTM虚拟机链接: https://mac.getutm.app/ 建议官网下载&#xff1a; 下载 Ubuntu Arm 64版 下载 Ubuntu Arm 64版链接: https://cn.ubuntu.com/download/server/arm 2 安装UTM 2.1 安装在mac上 2.2 点Open 2.3 建虚拟机### 2.4 点出虚拟机 2.5 O…

前端性能优化:从系统分析讲到实践策略

前言 在过去几年&#xff0c;我曾经写过几篇和性能优化相关的文章&#xff0c;例如有性能优化方法相关的&#xff0c;有性能监控相关的。但是都只关注于局部&#xff0c;没有从整体上去看待、分析性能优化。所以本文打算尝试从整体上去分析前端性能优化&#xff0c;从性能指标…

使用 RisingWave 和 Redash 处理和可视化实时数据

在创建流处理管道时&#xff0c;需要两个关键组件&#xff1a;一个用于处理和转换数据&#xff0c;一个用于数据可视化。RisingWave 和 Redash 就提供了一个优秀的解决方案。 RisingWave 是一个支持实时数据处理的分布式 SQL 流数据库。它提供增量更新的物化视图&#xff0c;使…

TRICONEX 3720 技术特点

TRICONEX 3720是一款安全管理系统通讯模块&#xff0c;通常用于工业自动化和安全系统中。它的主要作用是在控制系统中处理和管理数据通讯&#xff0c;确保信息在各个组件之间的有效传递。以下是关于TRICONEX 3720的详细介绍&#xff1a; 功能定位&#xff1a;TRICONEX 3720作为…

计算机操作系统总结(1)

1操作系统的概念&#xff08;定义&#xff09;功能和目标 (1)什么是操作系统&#xff1f; &#xff08;2&#xff09;操作系统的功能和目标—作为系统资源的管理者 &#xff08;3&#xff09;操作系统的功能和目标—向上层提供方便易用的服务 &#xff08;4&#xff09;操作系…

IP学习——ospf1

OSPF:开放式最短路径优先协议 无类别IGP协议&#xff1a;链路状态型。基于 LSA收敛&#xff0c;故更新量较大&#xff0c;为在中大型网络正常工作&#xff0c;需要进行结构化的部署---区域划分、ip地址规划 支持等开销负载均衡 组播更新 ---224.0.0.5 224.0.0.6 …

区块链开发:区块链软件开发包装相关解析

区块链开发是指设计、构建和维护基于区块链技术的应用程序或系统的过程。区块链是一种分布式账本技术&#xff0c;它通过去中心化的方式记录和验证数据&#xff0c;确保数据的透明性、不可篡改性和安全性。区块链开发者使用各种编程语言和框架来创建这些应用程序。 在加密货币领…

【Linux】-Linux文件的上传和下载、压缩和解压[9]

目录 前言 一、上传和下载 1、使用finalshell对Linux系统进行上传下载 2、rz、sz命令 二、解压和压缩 1、压缩格式 2、tar命令压缩 3、tar命令压缩 4、zip命令压缩文件 5、unzip命令解压文件 前言 在Linux系统中&#xff0c;文件的上传和下载、压缩和解压是非常重要…

暴风雨的短视频:成都鼎茂宏升文化传媒公司

暴风雨的短视频&#xff1a;大自然的力与美 ​随着科技的进步和网络的普及&#xff0c;短视频已经成为我们生活中不可或缺的一部分。在这些短暂而精彩的瞬间里&#xff0c;我们得以窥见世界的每一个角落&#xff0c;感受生活的多样性和复杂性。成都鼎茂宏升文化传媒公司而当我…

go语言之基本数据类型

文章目录 基础数据类型分类整数类型有符号整数无符号整数默认整数类型 浮点类型复数类型布尔类型字符类型字符串replace字符串获取字符串长度字符串的拼接字符串获取指定位置字符更多string操作 数据类型之间的转换其它基本类型转字符串类型fmt包中的Sprintfstrconv包中函数 字…

java 解决异常 Class path contains multiple SLF4J bindings

前面 为了使用 j2cache pom中导入了 <dependency><groupId>net.oschina.j2cache</groupId><artifactId>j2cache-core</artifactId><version>2.8.4-release</version> </dependency><dependency><groupId>net.osc…

Java开发之JDBC

JDBC 介绍JDBC程序&#xff08;Statement&#xff09;相关细节URLResultSet 连接池程序&#xff08;PreparedStatement&#xff09; 本文主要记录一下学习JDBC的一些知识点 介绍JDBC 首先谈谈什么是JDBC。下面放几张图&#xff0c;大致就可以清楚JDBC了。程序&#xff08;Sta…

网络编程—— Http的Get请求

http: hyper text transport protocal:超文本传输协议。 http是一种基于客户端-服务器模式的协议(Client-Server)。它规定只能由客户端先发起请求给服务器&#xff0c; 服务器做出响应。 http数据传输以数据报文的形式进行&#xff0c; 客户端向服务器发起的请求叫做请求报文。…

【Linux玩物志】Linux环境开发基本工具使用(终章) ——git与gdb调试器

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; 前言&#xff1a;这是最后一篇Linux工具篇&#xff0c;今天这篇文章我们要来简单讲一件git与调试器gdb。 目录 使用 git 命令行 安装 git 在 Github 创建项目 注册账号 创建项目 ​编辑 下载项目到本地 在 Gite…