【力扣-链表】移除链表元素

401 阅读2分钟

「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战」。

移除链表元素

题目描述

给你一个链表的头节点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  
输出:[]

解析

第一种解法:直接使用链表来进行移除元素操作

  1. 当链表为空时,返回空
  2. 当链表的头结点为所需移除元素时,删除头结点,其实只要将头结点向后移动一位就可以了
  3. 当上述两种情况排除时即为第三种情况,删除单链表中满足条件的结点,其实删除结点就是将需要移除结点的前一个结点的next指针指向需要移除结点的下一个结点即可

代码

public ListNode removeElements(ListNode head, int val) { 
    //当链表的头结点为所需移除元素时,删除头结点
    while (head != null && head.val == val) { 
          //删除头结点的操作:将头结点向后移动一位
          head = head.next; 
    } 
    // 链表为空时返回空
    if (head == null) { 
        return head; 
    } 
    // 第三种情况,此时链表不为空,同时head.val!=val
    //定义前一个结点,即可看作所需移除元素的前一个结点
    ListNode pre = head;
    //定义当前结点,即可看作移除元素的结点
    ListNode cur = head.next;   
    //当前结点不为空时
    while (cur != null) { 
        //移除元素
        if (cur.val == val) { 
            //移除元素操作:前一个结点的next指针指向下下个结点
            pre.next = cur.next; 
        } else { 
            pre = cur; 
        } 
        //继续向后操作,查找符合条件的结点然后将其删除
        cur = cur.next; 
     } 
    return head; 
}

第二种解法:递归
递归三要素:

  1. 明确这个函数想要做什么---递归函数功能
  2. 找出递归结束的条件
  3. 找出函数的等价关系式
public ListNode removeElements(ListNode head, int val) { 
    //递归结束条件:
    if(head==null){ 
        return null; 
    } 
    //等价关系式
    head.next=removeElements(head.next,val); 
    //递归函数功能
    if(head.val==val){ 
        return head.next; 
    }else{ 
        return head; 
    } 
}