203_移除链表元素

简介: 203_移除链表元素

203_移除链表元素

 

package 链表;
/**
 * https://leetcode-cn.com/problems/remove-linked-list-elements/
 *  思路覆盖法(后一个结点值覆盖掉当前结点,然后再处理一下指针指向,实现删除效果)
 * 
 * @author Huangyujun
 *
 */
public class _203_移除链表元素 {
    //递归
    class Solution {
        public ListNode removeElements(ListNode head, int val) {
            if (head == null) {
                return head;
            }
            head.next = removeElements(head.next, val);
            return head.val == val ? head.next : head;
        }
    }
    //我这道题这样干的话,就得去分开讨论最后一个结点是val时要怎么处理了
//    public ListNode removeElements2(ListNode head, int val) {
//        if(head == null) return null;
//        //好处,我想到了就是定义进入一个虚拟头结点
//        ListNode newHead = new ListNode(0);
//        newHead.next = head;
//        while(head != null) {
//            if(val == head.val) {    //找到了(还得考虑head.next是否为空,同时若当前待删除结点是最后一个的话,咱还得找到前一个,(解决可以定义一个prev 指针变量))
//                head.val = head.next.val;
//                head.next = head.next.next;
//            }else {
//                head = head.next;
//            }
//            
//        }        
//        return newHead.next;
//    }
    //官网:秒啊: while (temp.next != null) ,
    //如果我直接在 while(head != null) 改成: while(head.next != null) 导致到了最后一个结点的next是空,直接跳出循环,最后一个结点得不到判断
    // 官网的小心机是:加上了:(将自身变成了一个前一个结点位置prev,判断自身的next 是否等于val,若等于,自身就是待删除结点的前一个了,秒啊)
    /** 将开始遍历的位置移动到了虚拟头结点的位置(然后,通过next进行判断),这样就可以拿到最后一个结点了
              dummyHead.next = head;
            ListNode temp = dummyHead;
            while (temp.next != null) {
     */
    class Solution2 {
        public ListNode removeElements(ListNode head, int val) {
            ListNode dummyHead = new ListNode(0);
            dummyHead.next = head;
            ListNode temp = dummyHead;
            while (temp.next != null) {
                if (temp.next.val == val) {
                    temp.next = temp.next.next;
                } else {
                    temp = temp.next;
                }
            }
            return dummyHead.next;
        }
    }
}
目录
相关文章
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
153 1
|
5月前
|
存储
203. 移除链表元素,707.设计链表,206. 反转链表
链表是数据结构中的重要概念,包含单链表、双链表和循环链表。单链表每个节点存储数据与下一节点指针;双链表增加上一节点指针;循环链表首尾相连。 **例题解析:** 1. **203. 移除链表元素**:通过遍历链表删除指定值节点,注意处理头节点特殊情况。 2. **707. 设计链表**:实现链表的增删查操作,需理解指针操作逻辑,避免直接修改目标节点。 3. **206. 反转链表**:采用双指针或递归方法改变节点指向,完成链表反转。 以上题目涵盖链表核心操作,掌握后可灵活应对相关问题。
|
程序员
【刷题记录】移除链表元素
【刷题记录】移除链表元素
104 0
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
【数据结构OJ题】移除链表元素
力扣题目——移除链表元素
116 2
【数据结构OJ题】移除链表元素
【LeetCode 06】203.移除链表元素
【LeetCode 06】203.移除链表元素
114 0
|
存储 C语言
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
205 0
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
|
Python
【Leetcode刷题Python】203.移除链表元素
文章提供了三种删除链表中特定值节点的方法:迭代法、虚拟节点迭代删除法和递归法,并给出了相应的Python实现代码。
119 0
链表4(法二)------7-4 sdut-C语言实验-单链表中重复元素的删除
链表4(法二)------7-4 sdut-C语言实验-单链表中重复元素的删除
155 0