【数据结构】LeetCode移除链表元素、反转链表、链表的中间结点

news/2024/11/7 21:09:16/

目录

          一、移除链表元素

                1、题目说明

                2、题目解析

          二、反转链表

                1、题目说明

                2、题目解析

          三、链表的中间结点

                1、题目说明

                2、题目解析

 


 

一、移除链表元素

  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

输出:[ ] 

  2、题目解析

思路:这种方法是重新在定义一个新的链表,它有新的头指针和尾指针,将不等于 val 的元素链接到这个个新的链表上,就相当于我们实现链表的尾插,我们只需要遍历一遍链表,然后将不等于val的链接到一起,等于 val 时就跳过,然后释放旧的链表,最后再返回新的链表即可。

注意:在这里是分两种情况:(1)如果链表为空时,则直接返回就行;(2)如果链表不为空时,并且当不等于val时,第一次尾插的时候直接将旧链表的cur复制过去,如果不是第一次,就可以在后面链接了,如果等于val时,就将其删除。

struct ListNode* removeElements(struct ListNode* head, int val) 
{struct ListNode* cur = head;struct ListNode* newhead, * tail;newhead = tail = NULL;while (cur){if (head == NULL)return;if (cur->val != val){if (tail == NULL){newhead = tail = cur;}else{tail->next = cur;tail = tail->next;}cur = cur->next;}else{struct ListNode* newnext = cur->next;free(cur);cur = newnext;}}//如果数组全部等于val时,就全部删掉,所以tail就为NULL了,所以要判断一下if (tail)tail->next = NULL;return newhead;
}

二、反转链表

  1、题目说明

题目链接:反转链表

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

 

  2、题目解析

 思路1:从第一个元素开始头插,这个就完成了我们的反转。

 

struct ListNode* reverseList(struct ListNode* head) 
{struct ListNode* cur = head;struct ListNode* rhead = NULL;while (cur){struct ListNode* next = cur->next;//头插cur->next = rhead;rhead = cur;cur = next;}return rhead;
}

  思路2:直接反转链表的方向 。

struct ListNode* reverseList(struct ListNode* head)
{if (head == NULL)return NULL;struct ListNode* n1, * n2, * n3;n1 = NULL;n2 = head;n3 = n2->next;while (n2){n2->next = n1;//反转n1 = n2;n2 = n3;if (n3)n3 = n3->next;}return n1;
}

三、链表的中间结点

  1、题目说明

 题目链接:链表的中间结点

给定一个头节点为head的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。

  2、题目解析

 这道题有种比较巧妙的解法,就是用快慢指针,一个快指针fast,一个慢指针slow,快指针走两步,慢指针走一步。当fast->next为NULL时,slow刚好走到中间位置。

 

 

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

 


 本文要是有不足的地方,欢迎大家在下面评论,我会在第一时间更正。

 

   老铁们,记着点赞加关注!!! 


http://www.ppmy.cn/news/9079.html

相关文章

DALLE2-文本图像生成

文章目录摘要算法解码器prior图像处理变体插值文本差异限制论文: 《Hierarchical Text-Conditional Image Generation with CLIP Latents》github: https://github.com/lucidrains/DALLE2-pytorchhttps://github.com/LAION-AI/dalle2-laion摘要 CLIP已经…

【JDK工具】jinfo、jps、jstack、jstat、jmap

目录一、前言二、关键工具2.1 jps 显示所有JAVA进程信息1. 参数信息2. 常用命令2.2 jinfo 查看虚拟机配置参数信息1. 查看虚拟机参数 jinfo -flags pid2. 查看虚拟机指定参数 jinfo -flag 具体参数 pid3. 查看环境变量 jinfo -sysprops pid4. 参数列表2.3 jstack1. 能排查哪些问…

Springboot扩展点之BeanDefinitionRegistryPostProcessor

前言通过这篇文章来大家分享一下,另外一个Springboot的扩展点BeanDefinitionRegistryPostProcessor,一般称这类扩展点为容器级后置处理器,另外一类是Bean级的后置处理器;容器级的后置处理器会在Spring容器初始化后、刷新前这个时间…

前端面试常考 | js原型与原型链

文章目录一. 什么是原型?二. 什么是原型链?一. 什么是原型? 在js中所有的引用类型都有一个__proto__(隐式原型)属性,属性值是一个普通的对象。 而在js中的引用类型包括:Object,Array,Date,Function 而所有函数都有…

Lc.152 乘积最大子数组

题目链接1 前言翻译成大白话:就是找一个数组,其连续子数组的乘积最大值。2 算法思路:一般求最值的问题首选动态规划。这道题与[LC.53 最大子序和]很类似。我们假设状态转移方程为:它表示以第 i 个元素结尾乘积最大子数组的乘积可是在这里&…

Spring是怎么回事?新手入门就看这篇吧

前言 今天壹哥给大家介绍一套开源的轻量级框架,它就是Spring。在给大家详细讲解Spring框架之前,壹哥先给大家介绍Spring框架的主要内容: Spring的基本概念 Spring核心思想之ioc Spring核心思想之aop Spring框架对事务的支持 在本系列文章…

哪吒S亮相广州车展,定位B级燃油车颠覆者

2022年收官,哪吒汽车宣布全年交付152073台,其中: •哪吒U 51021台; •哪吒V 98847台; •哪吒S 2003台(12月首月交付)。与此同时,在年末的广州车展,哪吒汽车携全系车型参展…

视觉slam中的相机类型

作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> 顾名思义,视觉 SLAM(又称 vSLAM)使用从相机和其他图像传感器采集的图像。视觉 SLAM 可以使用普通相机(广角…