单链表oj

练习

1. 删除val节点

oj链接

这道题最先想出来的方法肯定是在遍历链表的同时删除等于val的节点,我们用第二中思路:不等于val的节点尾插,让后返回新节点。代码如下:

struct ListNode* removeElements(struct ListNode* head, int val) {struct ListNode* newhead = NULL,*tail = NULL,*cur = head;//tail解决尾插每次都要找尾的问题while(cur){if(cur->val == val){struct ListNode* del = cur;cur = cur->next;free(del);}else{if(newhead == NULL){newhead = tail = cur;}else{tail->next = cur;tail = cur;}cur = cur->next;tail->next = NULL;}}return newhead;
}

2.返回中间节点

oj链接

找中间节点,利用快慢指针,快指针一次走两步,慢指针一次走一步。快指针到终点,慢指针刚好走一半,慢指针走到的节点就是中间节点。唯一的区别就是偶数个节点和奇数个节点判断结束的条件略有不同。

struct ListNode* middleNode(struct ListNode* head) {struct ListNode* slow = head;struct ListNode* fast = head;while(fast && fast->next){slow = slow->next;fast = fast->next->next;}return slow;
}

3.合并链表

oj链接

这道题的思路和第一题大同小异,就是小的尾插。

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {if(list1 ==NULL)return list2;if(list2 == NULL)return list1;    struct ListNode* head1 = list1;struct ListNode* head2 = list2;struct ListNode* newhead =NULL, *tail = NULL;while(head1 && head2){if(head1->val < head2->val){if(newhead == NULL){newhead = tail = head1;}else{tail->next = head1;tail = tail->next;}head1 = head1->next;}else{if(newhead == NULL){newhead = tail = head2;}else{tail->next = head2;tail = tail->next;}head2 = head2->next;}}if(head1){tail->next = head1;}if(head2){tail->next = head2;}return newhead;
}

4.反转链表

oj链接

方法一: 头插

struct ListNode* reverseList(struct ListNode* head) {struct ListNode* cur = head;struct ListNode* newhead = NULL;while(cur){struct ListNode* next = cur->next;cur->next = newhead;newhead = cur;cur = next;} return newhead;
}

方法二:每个节点挨个反转

// 方法二:每个节点挨个反转
struct ListNode* reverseList(struct ListNode* head) {if(NULL == head){return NULL;}struct ListNode* n1 = NULL;struct ListNode* n2 = head;struct ListNode* n3 = n2->next;while(n2){n2->next = n1;n1 = n2;n2 = n3;if(n3)n3 = n3->next; }return n1;
}

5.链表分割

 oj链接

 这道题小于x的尾插一个链表,大于等于x的尾插另一个链表。最后把两个链表连接起来。两个链表使用带哨兵位的头结点会方便一些。

class Partition {
public:ListNode* partition(ListNode* pHead, int x) {// write code herestruct ListNode* lesshead,*lesstail,*greathead,*greattail;lesshead = lesstail =(struct ListNode*)malloc(sizeof(struct ListNode));greathead = greattail = (struct ListNode*)malloc(sizeof(struct ListNode));struct ListNode* cur = pHead;while(cur){if(cur->val < x){lesstail->next = cur;lesstail = lesstail->next;}else {greattail->next = cur;greattail = greattail->next;}cur = cur->next;}lesstail->next = greathead->next;greattail->next = NULL;pHead = lesshead->next;free(lesshead);free(greathead);return  pHead;}
};

6.链表的回文结构 

oj链接

这道题先找到中间节点,再反转中间节点后面的链表,之后再逐一对比即可。

struct ListNode* middleNode(struct ListNode* head){struct ListNode* slow =head,*fast = head;while(fast && fast->next){slow = slow->next;fast = fast->next->next;}return slow;
}
struct ListNode* reverseList(struct ListNode* head){struct ListNode* curr = head,*prev = NULL;while(curr){struct ListNode* tmp = curr->next;curr->next  =  prev;prev = curr;curr = tmp;}return  prev;
}
class PalindromeList {
public:bool chkPalindrome(ListNode* A) {// write code herestruct ListNode* mid =  middleNode(A);struct ListNode* rmid = reverseList(mid);while(rmid){if(A->val != rmid->val){return false;}else {A = A->next;rmid = rmid->next;}}return true;}
};

7.相交链表

oj链接 

 

 先判断是否相交,计算两链表的长度,长链表先走长度的差值,之后一起走找相交节点即可。

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode* list1 = headA;struct ListNode* list2 = headB;int len1 = 1,len2 = 1;while(list1->next){list1 = list1->next;++len1;}while(list2->next){list2 = list2->next;++len2;}if(list1 != list2){return NULL;}int len = abs(len1-len2);struct ListNode* shortlist = headA;struct ListNode* longlist =  headB;if(len1 > len2){shortlist = headB;longlist = headA;}while(len--){longlist = longlist->next;}while(longlist != shortlist){longlist = longlist->next;shortlist = shortlist->next;}return shortlist;
}

8.环形链表

 oj链接

 

利用快慢指针解决,如果有环快慢指针会相遇。

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

9.环形链表 ||

oj链接 

让一个指针从链表起始位置开始遍历链表,同时让一个指针从判环时相遇点的位置开始绕环 运行,两个指针都是每次均走一步,最终肯定会在入口点的位置相遇。

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

 证明:

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

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

相关文章

XML基础知识

1. 常见配置文件类型 properties文件,例如druid连接池就是使用properties文件作为配置文件 XML文件,例如Tomcat就是使用XML文件作为配置文件 YAML文件,例如SpringBoot就是使用YAML作为配置文件 json文件,通常用来做文件传输&#xff0c;也可以用来做前端或者移动端的配置文件…

软考高级-信息系统项目管理师案例题选择题做题总结

1.不应该只会建立变更和配置管理的规则&#xff0c;应该建立变更控制流程 2.变更的影响不应该只由工程师评估 3.没有对变更和修改进行记录 4.变更完成后&#xff0c;客户没有对变更进行验证 5.变更没有通知相关人员 6.变更没有和配置管理关联 7.项目变更管理的工作流程&#xf…

SOLIDWORKS科研版的介绍

SOLIDWORKS科研版的介绍 针对研究项目充分利用软件功能&#xff0c;无任何限制访问有关工程和科学的最新技术&#xff0c;并与世界各地的其他用户进行交流。 SOLIDWORKS科研版可为研究人员提供有关 SOLIDWORKS 设计和科学工程技术的最新知识&#xff0c;并使他们与世界范围内的…

08.CNN

文章目录 Observation 1Pooling - Max PoolingFlattenApplication&#xff1a;Playing Go使用验证集选择模型食物分类 Observation 1 Pooling - Max Pooling Pooling主要为了降低运算量&#xff0c;现在一般不用了&#xff0c;全convolution Flatten Application&#xff1a;P…

学校上课,是耽误我学习了。。

>>上一篇&#xff08;文科生在三本院校&#xff0c;读计算机专业&#xff09; 2015年9月&#xff0c;我入学了。 我期待的大学生活是多姿多彩的&#xff0c;我会参加各种社团&#xff0c;参与各种有意思的活动。 但我是个社恐&#xff0c;有过尝试&#xff0c;但还是难…

Linux|如何在 awk 中使用流控制语句

引言 当您从 Awk 系列一开始回顾我们迄今为止介绍的所有 Awk 示例时&#xff0c;您会注意到各个示例中的所有命令都是按顺序执行的&#xff0c;即一个接一个。但在某些情况下&#xff0c;我们可能希望根据某些条件运行一些文本过滤操作&#xff0c;这就是流程控制语句的方法。 …

鲸尾识别获奖方案总结

文章目录 1st solution(classification)2nd place code, end to end whale Identification model3rd place solution with code: ArcFace4th Place Solution: SIFT Siamese5th solution blog post code -Siamese7th place Pure Magic thanks Radek solution: classification9…

QGIS DEM数据快速获取

背景 Dem 是非常重要的数据&#xff0c;30 m 的精度也是最容易获取的&#xff0c;目前有很多种方式可以获取&#xff0c;比如地理空间数据云&#xff0c;今天介绍用 QGIS插件获取。 这种方式的最大优势是方便快捷。 插件下载与安装 插件-管理并安装插件-搜索下载 OpenTopogr…

linux:信号深入理解

文章目录 1.信号的概念1.1基本概念1.2信号的处理基本概念1.3信号的发送与保存基本概念 2.信号的产生2.1信号产生的五种方式2.2信号遗留问题(core,temp等) 3.信号的保存3.1 信号阻塞3.2 信号特有类型 sigset_t3.3 信号集操作函数3.4 信号集操作函数的使用 4.信号的处理4.1 信号的…

C# Winform实现五子棋游戏(代完善)

实现了基本的玩法。 BoardController.cs using System;namespace GomokuGame {public class BoardController{private static BoardController instance;private readonly int[,] board;private const int boardSize 15;private BoardController(){board new int[boardSize…

uniapp(h5 app) 中 webview和h5通信

1 uniapph5 和h5页面 通信 h5 window.parent.postMessage(message, *); uniapph5 onload中 window.addEventListener(message, function (e) { // 监听 message 事件 //console.log(e.origin) console.log(收到的cocos游戏ID,e.data) …

Python实现天气数据采集

Python实现天气数据采集 一、需求介绍二、完整代码一、需求介绍 本次天气数据采集的需求是获取每日的最高温、最低温、风力、风向、天气状况、AQI指数,如图所示,完整代码附后: 本次采集的目标网址是2345天气网: 上图的URL中,beijing是城市名称的缩写,54511即为城市代码…

数据库设计步骤and相关注意点

文章目录 前言数据库设计的主要步骤1.需求分析2.概念结构设计3.逻辑结构设计4.物理结构模型设计5.数据库实施和维护给出一些题目理解一下吧~ 总结 前言 学无止境&#xff0c;笔勤不辍。最近笔者状态不是特别好&#xff0c;一直忙于应付课程作业&#xff0c;于是一直没有时间更…

科技引领未来:高速公路可视化

高速公路可视化监控系统利用实时视频、传感器数据和大数据分析&#xff0c;通过图扑 HT 可视化展示交通流量、车速、事故和路况信息。交通管理人员可以实时监控、快速响应突发事件&#xff0c;并优化交通信号和指挥方案。这一系统不仅提高了道路安全性和车辆通行效率&#xff0…

vue3结合element-plus之如何优雅的使用表格

背景 表格组件的使用在后台管理系统中是非常常见的,但是如果每次使用表格我们都去一次一次地从 element-plus 官网去 复制、粘贴和修改成自己想要的表格。 这样一来也说得过去,但是如果我们静下来细想不难发现,表格的使用都是大同小异的,每次都去复制粘贴,对于有很多表格…

vue3封装ElementUI plus Dialog弹窗

因为ElementuiPlus的dialog弹框的初始样式不太好看,而公司要求又要好看,本来是已经实现了,但是后来想想了发现封装完dialog的其他功能也要,所以特此记录一下 方案一 思路:封装一个组件,将所有新增的参数引入el-dialog 参数中,实现参数共用 新建一个组件,将官网暴露的属性全部引…

C++开源库glog使用封装--自定义日志输出格式,设置日志保留时间

glog下载和编译 glog开源地址 https://github.com/google/glog glog静态库编译 cd /home/wangz/3rdParty/hldglog/glogmkdir out mkdir build && cd buildcmake .. -DCMAKE_INSTALL_PREFIX../out -DCMAKE_BUILD_TYPERelease -DBUILD_SHARED_LIBSOFF本文选择的glo…

网关路由SpringCloudGateway、nacos配置管理(热更新、动态路由)

文章目录 前言一、网关路由二、SpringCloudGateway1. 路由过滤2. 网关登录校验2.1 鉴权2.2 网关过滤器2.3 登录校验2.3.1 JWT2.3.2 登录校验过滤器 3. 微服务从网关获取用户4. 微服务之间用户信息传递 三、nacos配置管理问题引入3.1 配置共享3.1.1 在Nacos中添加共享配置3.1.2 …

【前端三剑客之HTML】详解HTML

1. HTML(超文本标记语言) HTML意为超文本标记语言&#xff0c;其可以通过标签把其他网页/图片/视频等资源引入到当前网页中&#xff0c;让网页最终呈现出来的效果超越了文本.HTML是一种标记语言&#xff0c;其是由一系列标签组成的. 而且每个标签都有特定的含义和确定的页面显…

Vue 3入门指南

title: Vue 3入门指南 date: 2024/5/23 19:37:34 updated: 2024/5/23 19:37:34 categories: 前端开发 tags: 框架对比环境搭建基础语法组件开发响应式系统状态管理路由配置 第1章&#xff1a;Vue 3简介 1.1 Vue.js的历史与发展 Vue.js由前谷歌工程师尤雨溪&#xff08;Eva…