移除链表元素详解

这篇具有很好参考价值的文章主要介绍了移除链表元素详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 原题出处:. - 力扣(LeetCode)


方法一:迭代

我们可以新创建一个链表,然后将不等于val的节点拿下来进行尾插,这样的方式更加简易,只需要遍历整个链表即可。

我们首先使用一个指针cur来遍历原链表,来获取不等于val的节点。

如果cur的next等于val就跳过这个节点,如果不等于val就尾插,直到当cur等于NULL,这时候就遍历完了整个数组。

然后再使用两个指针分别指向新链表的开头和末尾。

移除链表元素详解,刷题,链表,数据结构

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

最开始进行尾插的时候,因为newhead和newtail都是NULL,这时候并不是尾插而是让newhead和newtail指向这个节点 。

为了避免这个情况,我们也可以使用带有哨兵位的链表来解决这个问题。

struct ListNode* removeElements(struct ListNode* head, int val) {
	struct ListNode* guardHead = malloc(sizeof(struct ListNode));
	guardHead->next = head;
	struct ListNode* cur = guardHead;
	while (cur->next != NULL) {
		if (cur->next->val == val) {
			cur->next = cur->next->next;
		}
		else {
			cur = cur->next;
		}
	}
	struct ListNode* ret = guardHead->next;
	free(guardHead);
	return ret;
}

但是由于这个哨兵位是我们malloc的,最后离开函数一定要释放,否则会造成内存泄漏。 

这个方法是有点缺陷的,如果这些节点是使用动态内存开辟的,我们就没有释放这些节点,但是这个方法是满足题目条件的。 

方法二:递归 

链表的定义是具有递归的性质,因此链表的题目是可以使用递归解决的 

首先我们明白这个函数的功能是删除这个链表中等于val的元素的,那么我们可以对除开第一个节点的对后面的节点使用这个函数,得到的返回值就是就是后面的所有的节点就没有等于val的了。

    head->next = removeElements(head->next,val);

这样我们head->next后面的节点都没有了等于val的。

然后由于我们没有判断第一个节点是否等于val,此时我们就可以使用三目操作符来判断了。

 return head->val == val ? head->next : head;

如果头节点是等于val的,我们就返回head->next,这样我们就删除了所有等于val的节点。如果不等于val就直接返回head即可。

但是这里还有一个问题就是如果head节点是空,这样就会非法访问空节点了,所有我们还要判断是否是空节点。 

struct ListNode* removeElements(struct ListNode* head, int val) {
    if(head == NULL){
        return head;
    }
    head->next = removeElements(head->next,val);
    return head->val == val ? head->next : head;
}

 文章来源地址https://www.toymoban.com/news/detail-858266.html

 

 

到了这里,关于移除链表元素详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Leetcode刷题笔记题解(C++):203. 移除链表元素

    思路:不同的情况出现了,就是第一个节点要是为等于val的节点,可以新建一个节点,并next指向head,这样就可以遍历新的链表来删除节点

    2024年02月22日
    浏览(30)
  • 【代码随想录刷题记录】 203.移除链表元素 、 707.设计链表 、206.反转链表

    题目 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。 题目链接:https://leetcode.cn/problems/remove-linked-list-elements/ 代码 小结 该题主要注意链表删除的操作以及在特殊情况下如何进行操作。特殊情况包括头结点为目标

    2024年02月08日
    浏览(33)
  • 移除链表元素详解

      原题出处: . - 力扣(LeetCode) 我们可以新创建一个链表,然后将不等于val的节点拿下来进行尾插,这样的方式更加简易,只需要遍历整个链表即可。 我们首先使用一个指针cur来遍历原链表,来获取不等于val的节点。 如果cur的next等于val就跳过这个节点,如果不等于val就尾

    2024年04月26日
    浏览(32)
  • 刷题日记 Day 3 : Leetcode 203 . 移除链表元素、Leetcode 707 . 设计链表、Lettcode 206 . 反转链表

    本篇文章 , 是在代码随想录 60 天编程挑战的基础上进行的题目讲解 参与链接在此 : https://programmercarl.com/other/xunlianying.html 大家好 , 这个专栏 , 给大家带来的是 60 天刷题强训 . 最令大家头疼的事就是刷题了 , 题目又臭又长又抽象 , 有的题读都读不懂 , 更别说做了 . 所以 , 这个

    2023年04月09日
    浏览(39)
  • 算法刷题营【Day3】:: 链表篇:单链表结点删除思路:一题辨别哨兵结点的优势(删除有奇效):203. 移除链表元素

    本内容是笔者结合《代码随想录》总结所得,记录学习过程,分享知识! 目录: 1. 开篇例题:203. 移除链表元素 2. 题解参考 - - 2.1 方法一:原表操作(不含哨兵结点) - - 2.2 方法二:虚设哨兵结点辅助法 - - 2.3 方法三:递归法 3. 单链表结点删除思路 4. 方法思路点拨:原表操

    2024年02月06日
    浏览(36)
  • 【LeetCode题目详解】 203. 移除链表元素707. 设计链表206. 反转链表 day3(补)

    题意:删除链表中等于给定值 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 输出:[] 看到这道题就想到了链表 这道题有两种写法,涉及如下链表操作的两种方式: 直接使用

    2024年02月16日
    浏览(31)
  • 203.移除链表元素

    循环遍历整个链表 定义两个指针:prev,cur 如果cur是要删除的节点,prev-cur-next,然后free(cur) 但是注意每次都要新定义一个节点del,用来free,不影响原来的cur节点往下循环 更新cur和prev 但是需要注意如果删除的是头节点,就要特殊处理,画图带上指针,情况分析,一目了然。

    2024年01月22日
    浏览(34)
  • 移除链表元素

    ☃️个人主页:fighting小泽 🌸作者简介:目前正在学习C语言和数据结构 🌼博客专栏:leetcode练习题 🏵️欢迎关注:评论👊🏻点赞👍🏻留言💪🏻 题目链接: 移除链表元素 给你一个链表的头节点 head 和一个整数 val ,请你 删除链表中所有满足 Node.val == val 的节点 , 并返

    2024年02月04日
    浏览(31)
  • Java移除链表元素

    目录 1.题目描述 2.题解 题解1 题解2 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足  Node.val == val  的节点,并返回  新的头节点  。 示例 输入:head = [1,2,6,3,4,5,6],val = 6 输出:[1,2,3,4,5] 输入:head = [], val = 1 输出:[] 输入:head = [7,7,7,7], val = 7 输出:

    2024年02月07日
    浏览(25)
  • 移除链表元素 , 设计链表 ,反转链表

    leetcode 删除链表中等于给定值 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 输出:[] 移除元素  主要是  找到要移除的前一个  , 之后才能移除 。采用虚拟头节点的方法

    2024年02月08日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包