leetcode刷题 203. 移除链表元素,Easy (Java)迭代+递归

203. 移除链表元素

  • 1.题目描述
  • 2.题解
    • 2.1 遍历
      • 2.1.1 思路
      • 2.1.2 java
    • 2.2 递归
      • 2.2.1 思路
      • 2.2.2 Java代码

1.题目描述

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

示例 1:

leetcode刷题 203. 移除链表元素,Easy (Java)迭代+递归_第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
输出:[]

提示:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-linked-list-elements

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2.题解

2.1 遍历

2.1.1 思路

这里用到了链表中很常用的一个节点,叫做哑节点,简单解释一下就是没有用的空的节点。
哑节点是为了能够直接从头节点开始,防止遍历之后找不到头节点。
代码思路是:

  • 首先用哑节点指向头节点,然后用一个指针指向哑节点
  • 然后通过判断该指针指向的头节点的值是否为目标值,如果是,就跳过这个头节点;反之就将指针向后移,判断头节点的下一个节点
  • 遍历完之后,返回哑节点的下一个节点

2.1.2 java

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        ListNode prehead = new ListNode(0);
        prehead.next = head;
        ListNode pre = prehead;
        while(pre != null&&pre.next != null){
            int tempval = pre.next.val;
            if(tempval == val){
                pre.next = pre.next.next;
            }
            else{
                pre = pre.next;
            }
        }
        return prehead.next;
    }
}

2.2 递归

2.2.1 思路

递归的思路要更为简单一些,递归的思想就是先判断头节点是不是为目标值,然后通过该函数判断剩下的链表。
递归有三要素:参数和返回值,终止条件,单层递归逻辑。

  • 参数和返回值已经定好了
  • 终止条件:如果头节点为空了,那么就已经到尾节点了,那就可以终止了
  • 单层递归逻辑:判断头节点的值是否为目标值,剩下的放进去递归。如果头节点的值为目标值,那头节点就不要了,直接返回子链表的递归返回值;如果不为头节点,那就将头节点接上子链表的递归返回值,再返回。

2.2.2 Java代码

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        if(head == null){
            return null;
        }
        else if(head.val == val){
            return removeElements(head.next,val);
        }
        else{
            ListNode temp = removeElements(head.next,val);
            head.next = temp;
            return head;
        }
    }
}

你可能感兴趣的:(Leetcode刷题,Easy,leetcode,java,算法,数据结构)