首页 > 其他分享 >链表中的经典问题——移除链表元素I

链表中的经典问题——移除链表元素I

时间:2024-03-13 23:29:23浏览次数:28  
标签:current head val 移除 next 链表 经典 节点

移除链表元素

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

 题解一,迭代法:

解题思路:

        1. 首先需要考虑,链表为空或head节点的值等于val的情况,这里可以引入一个虚拟的哑节点dummy_node,该哑节点指向头节点,引入哑节点的好处就是不用特殊考虑链表为空或头节点为空的情况。

        2. 定义一个current变量,指向哑节点dummy_node;

        3. 从current.next开始遍历,直到为None;

        4. 遍历过程中,分两种情况处理,当current.next.val==val时,那么需要删掉该节点,指向下一个节点;

        5. 当current.next.val!=val时,继续执行遍历

代码实现:

class Solution:
    def remove_elements(self,head:Optional(ListNode), val:int)-> Optional(ListNode):
        
        # 定义一个虚拟哑节点
        dummy_node = ListNode(0)
        
        # 将哑节点指向头节点
        dummy_node.next = head

        # 定义一个current变量指向哑节点
        current = dummy_node
           
        # 从current.next开始遍历
        while current.next:
            
            if current.next.val == val:
                # 这里current.next指向了新的节点,那dummy_node也重新指向新的头节点
                current.next = current.next.next
            else:
                # 继续遍历
                current = current.next
        
        return dummy_node.next

# 为什么没有返回head,而是返回的dummy_node.next,因为当head.val==val时,并没有删除头节点即head,但是current.next = current.next.next却更新了dummy_node.next,即新的头节点

题解二,递归法:

解题思路:

代码实现:

class Solution:
    def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:
        if not head:
            return head 

        # 这里使用了递归调用 self.removeElements(head.next, val),它的作用是删除链表中除头节点外值为 val 的节点。这个调用会不断地向链表的后面部分递归,直到链表的末尾。
        head.next = self.removeElements(head.next,val)

        if head.val==val:
            return head.next
        else:
            return head

标签:current,head,val,移除,next,链表,经典,节点
From: https://blog.csdn.net/hahaha_1112/article/details/136622071

相关文章

  • leetcode 24.两两交换链表中的节点
    24.两两交换链表中的节点给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例1:输入:head=[1,2,3,4]输出:[2,1,4,3]示例2:输入:head=[]输出:[]示例3:输入:head=[1]输出:[1]提......
  • leetcode206. 反转链表
    一、链表(LinkedList)链表,是线性表的链式存储结构。一个链表中有若干个结点,每个结点都包含数据域和地址域两部分。数据域用于存储元素,地址域用于存储前驱或后继的地址。单链表:每个结点只有一个地址域的线性链表;双链表:每个结点都有两个地址域,分别指向前驱结点和后继结点。 ......
  • 【OJ】K 个一组翻转链表
    题目基本思路:用计数+栈实现分段,K个一组地翻转链表。#include<bits/stdc++.h>#include<stack>usingnamespacestd;structlist_node{intval;structlist_node*next;};list_node*input_list(){intval,n;scanf("%d",&n);list_node*phea......
  • 《牛客》-D小红数组操作 (链表)
    思路:采用链表进行动态维护即可我们采用map集合来模拟链表结构(用结构体也是可以的)就是输出需要一点点思考.ACcode:#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongmap<int,int>l,r;intq,x,y,op,k;voidsolve(){ cin>>q; while(q--){ cin>>o......
  • 【DL经典回顾】激活函数大汇总列表(持续更新中...)
    激活函数大汇总列表(持续更新中…)欢迎来到我们深入探索神经网络核心组成部分——激活函数的系列博客。在人工智能的世界里,激活函数扮演着不可或缺的角色,它们决定着神经元的输出,并且影响着网络的学习能力与表现力。鉴于激活函数的重要性和多样性,我们将通过一系列博客详细介绍......
  • 142. 环形链表 IIc
    /***Definitionforsingly-linkedlist.*structListNode{*intval;*structListNode*next;*};*/structListNode*detectCycle(structListNode*head){structListNode*slow=head,*fast=head;while(fast&&fast->next......
  • JS 链表 - 笔记
    代码:classListNode{/***@constructor*@param{number}val*@param{ListNode}next*/constructor(val,next){this.val=(val===undefined?0:val);this.next=(next===undefined?null:next);......
  • 《算法竞赛入门经典 第2版》 数学题目集
    例题10-1巨大的斐波那契数!(ColossalFibonacciNumbers!,UVa11582)巨大的斐波那契数!ColossalFibonacciNumbers!-洛谷例题10-2不爽的裁判(DisgruntledJudge,NWERC2008,UVa12169)不爽的裁判DisgruntledJudge-洛谷NOI数学学习相关书籍及视频等资料(不包......
  • 力扣面试经典150 —— 16-20题
    力扣面试经典150题在VScode中安装LeetCode插件即可使用VScode刷题,安装DebugLeetCode插件可以免费debug本文使用python语言解题,文中“数组”通常指python列表;文中“指针”通常指python列表索引文章目录16.[困难]接雨水16.1解法1:按行计算16.2解......
  • 经典算法掌握
    排序算法是对一组数据按照特定规则进行排序的算法。常见的排序算法有冒泡排序、插入排序、选择排序、快速排序和归并排序等。冒泡排序(BubbleSort):冒泡排序是通过不断比较相邻的两个元素并交换位置,让较大(或较小)的元素逐渐往后(或往前)移动,直到所有元素都排好序。冒泡排序的时间......