数据结构初阶leetcodeOJ题(二)

目录

第一题

 思路:

第二题

 思路

 第三题

描述

示例1

 思路

总结:这种类似的题,都是用快慢指针,相差一定的距离然后输出慢指针。


第一题

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

示例 1:

输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]

示例 2:

输入:head = [], val = 1
输出:[]

示例 3:

输入:head = [7,7,7,7], val = 7
输出:[]

 方法一

思路:

快慢指针:一个指向目标结点,一个指向目标结点的前驱结点。用一个tmp保存pos->next.

                  free()掉目标结点。

分两种情况:如果只有一个节点或者要删除的结点是首元节点,那么这时pre为NULL,pos                       指向pos;否则pre->next == pos;

 

struct ListNode* removeElements(struct ListNode* head, int val) {struct ListNode* pre = NULL;struct ListNode* pos = head;while(pos!=NULL){if(pos->val==val){struct ListNode* tmp = pos->next;free(pos);pos = tmp;if(pre==NULL){head = pos;}else{pre->next = pos;}}else{pre = pos;pos = pos->next;}}return head;
}

方法二: 

思想;

创建新链表,用尾插法,尾插法没有改变原指针的next指向所以不用保存next节点,

但是在free()时要保存下一节点。

 

struct ListNode* removeElements(struct ListNode* head, int val)
{struct ListNode* cur = head;struct ListNode* newhead = NULL;struct ListNode* tail = NULL;while(cur!=NULL){if(cur->val!=val){if(newhead==NULL){newhead = tail = cur;}else{tail->next = cur;tail = cur;}cur = cur->next;}else{struct ListNode* tmp = cur ->next;free(cur);cur = tmp;}}if(tail)tail->next=NULL;return newhead;}

 

 

第二题

给你单链表的头结点 head ,请你找出并返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

示例 1:

输入:head = [1,2,3,4,5]
输出:[3,4,5]
解释:链表只有一个中间结点,值为 3 。

示例 2:

输入:head = [1,2,3,4,5,6]
输出:[4,5,6]
解释:该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。

 思路

用快慢指针:快指针一次走两个,慢指针一次走一个。这样他们的路程之间差二倍。所以输出慢指针,即输出中间节点。

 

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

 第三题

描述

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

示例1

输入:

1,{1,2,3,4,5}

复制返回值:

{5}

 思路

用快慢指针:快指针比慢指针先走k步,然后两者在同时走。

 

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {// write code herestruct ListNode* pre =pListHead;struct ListNode* pos = pListHead;while(k--){if(pos!=NULL){pos = pos->next;}else{return NULL;}}while(pos!=NULL){pre = pre->next;pos = pos->next;}return pre;}

总结:这种类似的题,都是用快慢指针,相差一定的距离然后输出慢指针。

第四题 

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

示例 1:

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例 2:

输入:head = [1,2]
输出:[2,1]

示例 3:

输入:head = []
输出:[]

提示:

  • 链表中节点的数目范围是 [0, 5000]
  • -5000 <= Node.val <= 5000

进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?

 方法一

 将节点之间的next翻转。

用三个指针的原因是,只用两个指针翻转时,会导致链表断裂,但是用第三个指针保存下一个节点这样链表就不会断裂。

 

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*///方法一
struct ListNode* reverseList(struct ListNode* head) {if(head==NULL)return NULL;struct ListNode* left = NULL;struct ListNode* right= head;struct ListNode* tmp = head->next;while(right!=NULL){right->next = left;left = right;right = tmp;if(tmp!=NULL)tmp = tmp->next;}return left;
}

方法二 

用头插法,注意头插法需要保存指针。尾插法不用保存指针。

错误总结

 

(1)注意头插是新结点指向头结点,然后在将新节点设置为头结点。而不是直接将新节点设置为头节点 

(2)C语言赋值语句,左值是变量,将新节点设置为头结点。newnode = cur;这是头结点为cur

 

//方法二
struct ListNode* reverseList(struct ListNode* head) 
{if(head==NULL)return NULL;struct ListNode* cur = head;struct ListNode* newhead = NULL;while(cur!=NULL){struct ListNode* next = cur ->next; //保存下一个cur->next = newhead;newhead = cur;cur = next;}return newhead;
}

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

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

相关文章

工程化实战 - 前端AST(进阶)

###脚手架 *快速自动化搭建启动工具 目标: ####第一步:处理依赖 npm i path npm i chalk4.1.0 npm i fs-extra npm i inquirer8.2.2 npm i commander npm i axios npm i download-git-repo //ora easy-table figlet ####第二步:处理工程入口 ####3.加入命令交互 交互好帮手…

【计算机网络】TCP协议

文章目录 TCP协议TCP的结构TCP的特点 TCP如何保证可靠传输确认应答&#xff08;可靠机制&#xff09;超时重传&#xff08;可靠机制&#xff09;连接管理&#xff08;可靠机制&#xff09;滑动窗口&#xff08;效率机制&#xff09;流量控制&#xff08;可靠机制&#xff09;拥…

window系统vscode 编译wvp前端代码

下载代码 wvp-GB28181-pro: WEB VIDEO PLATFORM是一个基于GB28181-2016标准实现的网络视频平台&#xff0c;负责实现核心信令与设备管理后台部分&#xff0c;支持NAT穿透&#xff0c;支持海康、大华、宇视等品牌的IPC、NVR、DVR接入。支持国标级联&#xff0c;支持rtsp/rtmp等…

zsh和ohmyzsh安装指南+插件推荐

文章目录 1. 安装指南2. 插件配置指南3. 参考信息 1. 安装指南 1. 安装 zsh sudo apt install zsh2. 安装 Oh My Zsh 国内访问GitHub sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"这将安装 Oh My Zsh 和所…

Xrdp+Cpolar实现远程访问Linux Kali桌面

XrdpCpolar实现远程访问Linux Kali桌面 文章目录 XrdpCpolar实现远程访问Linux Kali桌面前言1. Kali 安装Xrdp2. 本地远程Kali桌面3. Kali 安装Cpolar 内网穿透4. 配置公网远程地址5. 公网远程Kali桌面连接6. 固定连接公网地址7. 固定地址连接测试 前言 Kali远程桌面的好处在于…

工作记录-------双 11场景下库存更新 SQL 优化

背景&#xff1a;双 11 期间&#xff0c;系统的行为是要尽可能多地卖出商品&#xff0c;尽可能多地收订单&#xff0c;又不能超过库存。 在这种高并发、大流量场景下&#xff0c;整个系统的瓶颈点必然在数据库上&#xff0c;本篇文章就库存更新这一场景下讨论如何优化事务 SQL。…

力扣面试经典150题详细解析

刷题的初心 众所周知&#xff0c;算法题对于面试大厂是必不可缺的一环&#xff0c;而且对于提高逻辑思维能力有着不小的提升。所以&#xff0c;对于程序员来讲&#xff0c;无论刚入行&#xff0c;还是从业多年&#xff0c;保持一个清醒的头脑&#xff0c;具备一个良好的设计思…

SIMD单指令多数据(并行计算)

单指令多数据&#xff08;SIMD&#xff09;是一种并行计算的技术&#xff0c;允许一个指令同时对多个数据元素进行操作。这对于向量计算和多媒体应用非常有用&#xff0c;因为它们经常涉及到对大块数据执行相同的操作。 在 SIMD 中&#xff0c;数据通常被组织成“向量”&#…

从傅里叶变换,到短时傅里叶变换,再到小波分析(CWT),看这一篇就够了(附MATLAB傻瓜式实现代码)

本专栏中讲了很多时频域分析的知识&#xff0c;不过似乎还没有讲过时频域分析是怎样引出的。 所以本篇将回归本源&#xff0c;讲一讲从傅里叶变换→短时傅里叶变换→小波分析的过程。 为了让大家更直观得理解算法原理和推导过程&#xff0c;这篇文章将主要使用图片案例。 一…

圣杯布局和双飞翼布局

圣杯布局&#xff08;Holy Grail Layout&#xff09;和双飞翼布局&#xff08;Double Wings Layout&#xff09;是两种常见的多列布局技术&#xff0c;用于实现一个固定宽度的主内容区域&#xff0c;以及左右两侧可变宽度的侧边栏。这两种布局都希望能够实现以下效果&#xff1…

客户端缓存技术

客户端缓存技术主要有以下几种&#xff1a; 内存缓存&#xff1a;客户端&#xff08;如浏览器&#xff09;会将请求到的资源&#xff08;如HTML页面、图片文件等&#xff09;存储在内存中&#xff0c;以便在再次访问相同资源时可以快速获取&#xff0c;减少向服务器的请求次数…

数据结构第四课 -----线性表之栈

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

C_12练习题

一、单项选择题(本大题共20小题,每小题2分&#xff0c;共40分。在每小题给出的四个备选项中&#xff0c;选出一个正确的答案&#xff0c;并将所选项前的字母填写在答题纸的相应位置上。) C 风格的注释&#xff0c;也称块注释或多行注释&#xff0c;以&#xff08;&#xff09;…

Python实战——Selenium与iframe结合应用

1. 页面中为什么会存在iframe 网页中存在iframe&#xff08;内联框架&#xff09;的主要原因是为了实现页面的嵌套和分割&#xff0c;使得网页可以同时加载多个独立的HTML文档。 以下是一些常见的使用场景和目的&#xff1a; 嵌入其他网页或内容&#xff1a;通过使用iframe&a…

Kotlin语言实现单击任意TextVIew切换一个新页面,并且实现颜色变换

<LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:orientation"vertical"android:layout_height"match_parent"><!-- 这里放置你的其他视图组件 -->&…

软件开发、网络空间安全、人工智能三个方向的就业和前景怎么样?哪个方向更值得学习?

软件开发、网络空间安全、人工智能这三个方向都是当前及未来的热门领域&#xff0c;每个领域都有各自的就业前景和价值&#xff0c;以下是对这三个方向的分析&#xff1a; 1、软件开发&#xff1a; 就业前景&#xff1a;随着信息化的加速&#xff0c;软件开发的需求日益增长。…

SVG的viewBox、width和height释义, 示例及代码

svg的是没有边界的&#xff0c;svg画布只是用于展示svg世界中某一个范围的内容&#xff0c;而对于超过了svg画布范围的内容&#xff0c;则会被遮挡。默认svg画布默认显示世界坐标下原点坐标的width*height面积的矩形视野。 ​ 我们可以通过viewBox来修改默认的显示配置&#…

CAS源码工程搭建记录

CAS源码工程搭建 1.下载2.gradle下载源改为阿里云&#xff0c;解决下载慢的问题3.解决保存 1.下载 git clone -b 5.3.x https://gitee.com/mirrors/CAS.git如果下载的是压缩包&#xff0c;导入工程会保存&#xff0c;因为builder.gradle的第20行开始有取git信息&#xff0c;如…

springboot(ssm宝鸡文理学院学生成绩动态追踪系统 成绩管理系统Java(codeLW)

开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#xff09; 数据库工具&#xff1a;Navicat 开发软件&#xff1a;ecl…

java的语法和C#有哪些不同?

Java 和 C# 都是现代编程语言&#xff0c;它们在很多方面有相似之处&#xff0c;但也存在一些语法和特性上的不同。以下是一些 Java 和 C# 之间的主要语法差异&#xff1a; 1、语法结构&#xff1a; Java 使用大括号 {} 表示代码块&#xff0c;而 C# 也是如此。两者在大多数基…