[Leetcode 203][Easy]移除链表元素

目录

一、题目描述

二、整体思路

三、代码


一、题目描述

原题链接

二、整体思路

首先分成两种情况。第一种情况要先判断头元素是否要删除。第二种要在第一种基础上进行(删除到头元素不是要删除的元素),然后遍历链表,遍历到不是要删除的元素再链接。

最开始的想法:遍历链表的时候不能直接用head,否则会改变head,要新设一个ListNode prev=head。用prev去链接不符合删除元素的结点。同时新设ListNode temp=head.next用于遍历。

关于链表,要想清楚的地方是:prev指向的ListNode类,改变其next属性。和head通过迭代访问next属性所访问到的类的next属性也会一起改变,因为两者访问到的是同一个类。

改进后的思路:不另外设置temp结点。只利用prev结点就足够了。当prev的下一个结点不是要被删除的结点时才更新prev,否则删除prev的下一个结点。

三、代码

java 复制代码
/**
 * 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) {
        
        while(head!=null && head.val==val){//首元素是要被删除的情况
            head=head.next;
        }
        if(head==null) return head;//链表为空与所有元素都为要被删除的元素的情况
        ListNode temp=head.next;
        ListNode prev=head;
        while(true){
            if(temp!=null && temp.val!=val){//不是被删除的元素,要保留
                prev.next=temp;
                prev=prev.next;
            }else if(temp==null){
                prev.next=null;
                break;
            }
            temp=temp.next;//temp是遍历的
        }
        return head;
    }
}
java 复制代码
/**
 * 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) {
        
        while(head!=null && head.val==val){
            head=head.next;
        }
        if(head==null) return head;
        ListNode prev=head;//优化,不另外设置temp的做法
        while(prev.next!=null){
            if(prev.next!=null && prev.next.val==val){//prev结点下一个结点是要删除的节点
                ListNode delnode=prev.next;
                prev.next=delnode.next;
                delnode.next=null;
            }else{
                prev=prev.next;//prev结点下一个结点不是要删除的节点是,把prev更新该结点
            }

        }
        return head;
    }
}
相关推荐
红糖生姜40 分钟前
字符串|数组|计算常见函数整理-竞赛专用(从比赛真题中总结的,持续更新中)
c++·算法
焜昱错眩..2 小时前
代码随想录训练营二十六天| 654.最大二叉树 617.合并二叉树 700.二叉搜索树的搜索 98.验证二叉搜索树
数据结构·算法
jndingxin2 小时前
OpenCV CUDA模块中用于稠密光流计算的 TV-L1(Dual TV-L1)算法类cv::cuda::OpticalFlowDual_TVL1
人工智能·opencv·算法
geneculture2 小时前
路径=算法=操作:复杂系统行为的统一数学框架
人工智能·算法·数学建模·课程设计·智慧系统·融智学的重要应用·复杂系统
AcrelGHP2 小时前
建筑末端配电回路安全用电解决方案:筑牢电气防火最后一道防线
人工智能·算法·安全
Watink Cpper2 小时前
[灵感源于算法] 链表类问题技巧总结
数据结构·算法·链表
PassLink_4 小时前
AlgorithmVisualizer项目改进与部署-网页算法可视化
算法·编程·开源项目·本地部署·算法可视化·源码改进
GalaxyPokemon5 小时前
LeetCode - 2. 两数相加
java·前端·javascript·算法·leetcode·职场和发展
编程绿豆侠5 小时前
力扣HOT100之堆:347. 前 K 个高频元素
算法·leetcode·哈希算法
GalaxyPokemon7 小时前
归并排序:分治思想的高效排序
数据结构·算法·排序算法