leetcode算法203. 移除链表元素

63 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情

一、题目描述:

203. 移除链表元素 - 力扣(LeetCode)

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

示例 1:

image.png

输入: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
输出:[]

提示:

  • 列表中的节点数目在范围 [0, 10^4] 内
  • 1 <= Node.val <= 50
  • 0 <= val <= 50

二、思路分析:

  1. 设置虚拟头结点,然后设置一个指针,指向待删除结点的上一个结点\
  2. 遍历链表,将结点中与该值相同的结点删除;结点中的值与待删除的值不一样时,将指针下移

三、AC 代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode removeElements(ListNode head, int val) {

      ListNode dummyHead = new ListNode(-1);
        dummyHead.next = head;
        ListNode prev = dummyHead;
        while(prev.next != null){
            if(prev.next.val == val){
                prev.next = prev.next.next;
            }else{
                prev = prev.next;
            }
        }

        return dummyHead.next;

    }
}

四、总结:

链表的定义具有递归的性质,因此链表题目常可以用递归的方法求解。递归的可以看下官方的题解。

处理特殊情况 然后开始双指针,一前一后,一起走 当后面的节点值等于val时,前面指针不动,后面指针继续走,直到节点的值!=val 此时把前面指针的next指向后面节点,即把中间这些值为val的节点删除了

范文参考:

思路简单。性能高效,一看就懂 - 移除链表元素 - 力扣(LeetCode) (leetcode-cn.com)

203. 移除链表元素:【直接删除法】【虚拟头指针】详解 ! - 移除链表元素 - 力扣(LeetCode)