首页 > 其他分享 >203. 移除链表元素

203. 移除链表元素

时间:2023-12-15 10:26:09浏览次数:34  
标签:203 ListNode val head next 链表 移除 节点

题目:

203. 移除链表元素

要求:

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

解答:

独自写出来了,但是代码=写的不好,我的思路是分两步,第一步先把头节点等于目标值的节点全部删除,第二步在遍历后续节点,删除等于目标值的节点,这一步需要一个头节点引用。代码如下:

/**
 * 移除元素,注意头节点的移除
 *
 * @param head 头节点
 * @param val  目标值
 * @return 移除元素后的头节点
 */
public static ListNode removeElements(ListNode head, int val) {
    if (head == null) {
        return head;
    }
    // 考虑头部是目标元素,先去除头部是目标元素
    while (head != null && head.val == val) {
        head = head.next;
    }
    ListNode result = head;
    while (result != null) {
        while (result.next != null && result.next.val == val) {
            result.next = result.next.next;
        }
        result = result.next;
    }
    return head;
}

看了下官方题解,官方给出了两个题解,可以理解为一个倒叙删除,一个正序删除。先说倒叙删除,倒叙删除是一个递归的思路,链表天然有递归的特性,这道题目里面就是递归的思路,先判断下一个节点,这样层层递归就是从尾部开始进行判断和删除,要注意递归最重要的就是终止条件,代码如下:

/**
 * 递归的思路
 * @param head
 * @param val
 * @return
 */
public static ListNode removeElements3(ListNode head, int val) {
    if (head == null) {
        return head;
    }
    // 相当于遍历了一遍链表
    head.next =  removeElements3(head.next, val);
    return head.val == val ? head.next : head;
}

官方的第二个题解和我之前的思路是相同的,是我思考的方式问题,这个题解让我学到了在链表的题目中,有一个很重要的思路就是构造虚拟头节点,这样省去了判断头节点的过程,只需要后面一部分,就是判断下一个节点是否等于目标值,如果相等,则让当前节点的指针指向下下个节点,如此遍历到最后一个节点就会删除全部的目标值节点了。代码如下:

/**
 * 构造虚拟节点
 * @param head
 * @param val
 * @return
 */
public static ListNode removeElements2(ListNode head, int val) {
    // 构造虚拟节点
    ListNode virtual = new ListNode(0);
    virtual.next = head;
    ListNode temp = virtual;
    while (temp.next != null) {
        if (temp.next.val == val) {
            temp.next = temp.next.next;
        } else {
            temp = temp.next;
        }
    }
    return virtual.next;
}

标签:203,ListNode,val,head,next,链表,移除,节点
From: https://www.cnblogs.com/wadmwz/p/17902766.html

相关文章

  • 【删除排序链表中的重复元素】模拟
    leetcode82.删除排序链表中的重复元素II题意:只要链表中元素x重复出现了,删除所有元素x(刚开始还读错题了……)题解:在表头前添加链表的虚拟节点dummy遍历链表(1)如果当前节点cur的下一个节点cur.next和cur.next.next相等,则意味着出现了重复元素,记录元素值,从cur.next开始挨个删......
  • 【合并排序链表】分治/优先队列
    合并两个排序链表模拟维护一个合并链表,每次添加两个排序链表中较小val的节点即可模拟代码publicListNodemergeTwo(ListNodea,ListNodeb){if(a==null)returnb;if(b==null)returna;ListNodeans=newListNode(0);Lis......
  • 【删除链表的倒数第N个节点】双指针
    leetcode19.删除链表的倒数第N个结点题解1:通过链表长度获取[倒数第n个节点]位置计算链表长度找到[倒数第N个节点]的前一个节点删除[倒数第N个节点]注意特殊情况:删除的是第一个节点时,直接返回第二个节点即可点击查看代码/***Definitionforsingly-linkedlist.......
  • 【大数相加链表模拟】
    leetcode2.两数相加题意:两个长度为[1,100]的大数,分别倒序存储(个位在链表头)在两个链表中,计算两个数的和,并倒序存储在一个新链表,返回链表表头。数据中不存在前导零。题解:模拟大数相加,注意维护进位carry即可代码/***Definitionforsingly-linkedlist.*publicclassL......
  • 【回文链表】快慢指针+反转链表
    leetcode234.回文链表题意:判断一个链表是不是回文(中心对称)的【反转链表】题解1:得到原链表的反转链表,然后对比原链表与反转链表的内容是否一致即可。反转链表版本代码/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNo......
  • 【反转链表】while循环/递归
    leetcode206.反转链表题意:给定链表表头,反转链表,返回反转链表的表头【循环】题解:head维护原链表当前节点,nHead维护反转链表的头节点,nHead置于head前一位,依次后移,直至head到链表尾结束。双指针循环版本/***Definitionforsingly-linkedlist.*publicclassListNode......
  • 代码随想录算法训练营第一天|704.二分查找、27.移除元素
    LeetCode704二分查找题目链接704.二分查找二分法确定区间(循环不变量):对于有序数组,定义循环区间二分查找元素 LeetCode27.移除元素题目链接:27.移除元素快慢指针,快指针查,慢指针存 ......
  • 代码随想录算法训练营第一天 | 数组理论基础,704. 二分查找,27. 移除元素
    一、数组理论基础学习前:1.数组定义一些在内存上连续存储的相同数据类型的数据的集合2.数组特征便于查询数组元素,不便于增删数据元素学习后:对于Java,二维数组不一定在内存上连续。如int[i][j],唯一确定的是int[i][]在内存上连续二、704.二分查找LeetCode704.二分查找......
  • 代码随想录算法训练营第一天| LeetCode704 二分查找、27移除元素
     Leetcode704:二分查找今日学习的文章链接:代码随想录(programmercarl.com) 题目链接:704.二分查找-力扣(LeetCode)●  自己看到题目的第一想法这题我会,但是还没明白卡尔说的循环不变量是什么意思。我的固定思路就是,target比中间值大,左指针右移到mid+1;target比中间值......
  • 算法学习Day1,二分查找,移除元素
    Day1二分查找,移除元素ByHQWQF2023/12/13笔记704.二分查找给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。解法:使用二分查找来在一个有序的数组中找到指定元素的下标。根据数据边界......