数据结构算法题 2(力扣)——链表

1. 分割链表(OJ链接)

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

本题做法是:遍历链表将链表分为两部分,一部分的结点值小于特定值,另一部分的结点值大于或等于特定值,最后将两个链表链接起来。为了方便,下面将两部分链表称为大小链表。(值大于等于或小于特定值的链表)

为了便于将结点链接到大小链表中,采用带头结点的方式解决,可以避免大小链表为空或者不为空的讨论。

当遍历完链表后,可能出现链表成环的情况,因此需要将大链表的尾指针置空。

题解代码如下

typedef struct ListNode ListNode;
struct ListNode* partition(struct ListNode* head, int x)
{if(head==NULL){return NULL;}//创建两个带头链表ListNode* lesshead,*lesstail,*morehead,*moretail,*cur;lesshead=lesstail=(ListNode*)malloc(sizeof(ListNode));morehead=moretail=(ListNode*)malloc(sizeof(ListNode));cur=head;//遍历原链表while(cur){if(cur->val<x){lesstail->next=cur;lesstail=lesstail->next;}else{moretail->next=cur;moretail=moretail->next;}cur=cur->next;}//防止成环moretail->next=NULL;//首尾相连lesstail->next=morehead->next;ListNode* ret=lesshead->next;free(lesshead);free(morehead);return ret;
}

lesshead,lesstail,morehead,moretail分别是小链表和大链表的头尾指针。最初都指向头结点。

2. 旋转链表(OJ链接)

题目描述:给你一个链表的头节点head ,旋转链表,将链表每个节点向右移动 k 个位置。

示例:
在这里插入图片描述
结果可以看作将后2个结点原封不动的挪到前面。因此需要找到倒数第k个结点,方法就是快慢指针法。

本题需要注意k的值,k可能很大,比如远大于结点的个数,当k等于结点的个数时,所有结点向右移动k个位置相当于不用移动,因此需要对k进行求余操作。

此题做法为:快慢指针法。首先先计算链表结点的数目,对k进行求余。fast指针先走k步,之后和慢指针以相同速度走,快指针为NULL时,慢指针指向的结点就是倒数第k个结点。为了避免成环,需要将倒数第k+1个结点的指针域置空,最后链接两部分链表即可。

一些需要注意的小的点就不多赘述了,比如链表为空或者只有一个结点,那么直接返回NULL或head即可。

题解代码如下:

struct ListNode* rotateRight(struct ListNode* head, int k) 
{//结点数为0if(head==NULL)return NULL;//结点数为1if(head->next==NULL)return head;struct ListNode* cur=head,*fast=head,*prev=head,*tail=head;int num=0;//计算链表结点个数while(cur){num++;cur=cur->next;}k%=num;if(k==0)return head;//fast先走k步cur=head;while(k--){fast=fast->next;}while(fast){prev=cur;cur=cur->next;tail=fast;fast=fast->next;}//解环并链接首尾prev->next=NULL;tail->next=head;return cur;
}

指针含义:cur——指向新链表的头,prev——cur的前一个结点,tail——指向最后一个结点
对上述示例进行画图帮助理解代码,过程如下图
在这里插入图片描述
本题到此就结束咯

3. 环形链表(OJ链接)

题目描述:给你一个链表的头节点 head ,判断链表中是否有环。

此题解法:快慢指针法,快指针一次走两步,慢指针一次走一步。两个指针指向同一个结点时,说明链表有环,快指针为NULL时说明链表没有环。

代码如下

bool hasCycle(struct ListNode *head) {struct ListNode* fast=head,*slow=head;while(fast!=NULL&&fast->next!=NULL){slow=slow->next;fast=fast->next->next;if(slow==fast){return true;}}return false;
}

本题代码比较简单,但是这个思路是否正确需要验证,本质是一道数学题,验证过程如下图。

在这里插入图片描述

4. 环形链表2(OJ链接)

题目描述:给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

这个题可以看成上一题的后续,有环则找入环点。

这里先证明一个式子再写代码:有两个指针,一个指针从链表的头走,一个指针从相遇点走,并且同速走,那么当两个指针相遇时,相遇的那个结点就是入环点。

证明过程如下图
在这里插入图片描述
那么有了上述的结论再加上上一题的思路,本题就比较简单了。

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

链表部分的题目就到此为止了,后续就对栈队列等数据结构进行练习。

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

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

相关文章

文旅元宇宙|“元宇宙+”全面赋能智慧文旅场景建设

元宇宙作为下一代互联网入口&#xff0c;正在潜移默化的改变着人生的生活方式&#xff0c;不断催生新业态&#xff0c;带给人们前所未有的体验。元宇宙概念的崛起&#xff0c;正以其独特的魅力&#xff0c;引领着一场全新的智慧文旅革命。元宇宙&#xff0c;这个融合了虚拟现实…

Discord注册教程:Discord刚注册就被封怎么办?附申诉教程!

Discord如今在海外社交媒体平台中迅速崛起&#xff0c;许多社交媒体营销人员也纷纷利用其社群特性进行推广&#xff0c;Discord注册也就成为社媒营销人员必经之路。然而&#xff0c;很多人注册Discord账号时常常会想&#xff1a;“在国内使用Discord会封号吗&#xff1f;”事实…

抖音电商罗盘品牌人群运营策略指南

【干货资料持续更新&#xff0c;以防走丢】 抖音电商罗盘品牌人群运营策略指南 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 抖音运营资料合集&#xff08;完整资料包含以下内容&#xff09; 目录 品牌人群运营策略&#xff0c;旨在帮助品牌通过精细化运营提…

腾讯云存储面向AIGC全面升级,搭载全面自研存储引擎

云厂商继续为大模型加速落地铺路架桥。 4月8日&#xff0c;腾讯云宣布云存储解决方案面向AIGC场景全面升级&#xff0c;能够针对AI大模型数据采集清洗、训练、推理、数据治理全流程提供全面、高效的云存储支持。数据显示&#xff0c;采用腾讯云AIGC云存储解决方案&#xff0c;…

键值数据库Redis——Windows环境下载安装+命令行基本操作+Java操纵Redis

文章目录 前言一、下载与安装&#xff08;Windows环境&#xff09;** 检查数据库连接状态 **** 查看Redis数据库信息 ** 二、Redis五种数据结构与基本操作获取所有的key——keys *清空所有的key——flushall2.1 字符串操作2.2 散列操作2.3 列表操作2.4 集合操作2.5 位图操作 三…

2_7.Linux中的无人值守安装脚本kickstart

## 一.kickstart自动安装脚本的作用 ## #在企业中安装多台操作系统时面临的问题# 当安装Linux操作系统时&#xff0c;安装过程会需要回答很多关于设定的问题 这些问题必须手动选择&#xff0c;否则无法进行安装 当只安装1台Linux系统&#xff0c;手动选择设定工作量比较轻松 当…

JAVA毕业设计135—基于Java+Springboot+Vue的服装商城(源代码+数据库+万字论文)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootVue的服装商城(源代码数据库万字论文)135 一、系统介绍 本项目前后端分离&#xff0c;分为管理员、用户两种角色 1、用户&#xff1a; 注册、登录、服装购买、…

Axios 使用教程

Axios 是什么? Axios 是一个基于 promise 网络请求库&#xff0c;作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。 特性 从浏览器创建 XM…

day02php环境和编译器—我耀学IT

一、环境介绍 1、web 环境 使用 PHP 需要先安装环境&#xff0c;安装环境比较麻烦&#xff0c;需要安装Web服务、PHP应用服务器、MySQL管理系统。 Web服务&#xff1a;apache 和 nginx PHP&#xff1a;多版本 MySQL&#xff1a;多版本 2、环境集成包 因为多环境、多版本、多系…

“鲜花换冥币,文明寄哀思“张家口慈善义工联合会清明节活动

又是一年春草绿&#xff0c;梨花风起正清明。扫墓祭祖、缅怀先人是清明节的重要民俗活动&#xff0c;为摒弃传统陋习&#xff0c;树文明祭祀新风&#xff0c;2024年4月4日&#xff0c;张家口慈善义工联合会携手市人民公墓西祥园组织志愿者们开展以“鲜花换冥币&#xff0c;文明…

-bash: cd: /etc/hadoop: 没有那个文件或目录

解决办法&#xff1a;source /etc/profile 运行 source /etc/profile 命令会重新加载 /etc/profile 文件中的配置&#xff0c;这样做的目的是使任何更改立即生效&#xff0c;而不需要注销并重新登录用户。通常&#xff0c;/etc/profile 文件包含系统范围的全局 Shell 配置&…

Linux上下载部署zentao v15.5及具体的使用

1.先查询一下Linux的操作系统的位数&#xff0c;确保下载的文件位数与os的一致 [rootlocalhost xiaoming]# uname -m x86_64 [rootlocalhost xiaoming]# getconf LONG_BIT 64 2.下载zentao的Linux压缩包 wget https://www.zentao.net/dl/zentao/15.5/ZenTaoPMS.15.5.zbox…