【数据结构与算法】203.移除链表元素(LeetCode)图文详解

移除链表元素

题目传送门

思路一:遍历链表

定义一个指针prev遍历整个数组 如果他下一个节点的val值为val,就移除这个节点,让prev的next指针指向被删除的下一个节点,然后prev后移,直到prev的next指针为空

按照这个思路,有以下代码

c 复制代码
struct ListNode* prev;
while(prev!=NULL)
{
    if(prev->next->val=val)
    {
        struct ListNode* del=prev->next;
        prev->next=del->next;
        free(del);//释放内存时,必须用原指针 
    }
    else
    {
        prev=prev->next;
    }
}

我们再来看特殊的情况

链表为空时

直接返回空指针

c 复制代码
if(head==NULL)
{
    return NULL;
}

头节点的val值为被删除的元素时

c 复制代码
while(head!=NULL&&head->val==val)
{
    struct ListNode*del=head;
    head=head->next;
    free(del);
    
}

完整代码如下

c 复制代码
struct ListNode* removeElements(struct ListNode* head, int val) {

    while(head!=NULL&&head->val==val) 
    {
        struct ListNode*del=head;
        head=head->next;
        free(del);
    }
    if(head==NULL)
    {
        return NULL;
    }
    struct ListNode*prev = head;
    
     while(prev->next!=NULL)
    {
        
        if(prev->next->val==val)
        {
            struct ListNode* del=prev->next;
            prev->next=prev->next->next;
            free(del);
        }
        else{
        prev=prev->next;
        }
            
    }
        return head;    
}

思路二:创建新的链表

本质:定义一个指针pcur 让他去遍历原链表 如果pcur->val不为val,就把他尾插到新的链表中

c 复制代码
struct ListNode* removeElements(struct ListNode* head, int val){
	//创建新的头节点 尾节点
    struct ListNode* NewHead,*NewTail;
    NewHead=NULL;
    NewTail=NULL;
    struct ListNode*pcur=head;
    //遍历原链表
    while(pcur)
    {
        
        //找值不为val的节点,尾插到新链表中
        if(pcur->val!=val)
        {
            //链表为空(第一次插入)
            if(NewHead==NULL)
            {
                NewHead = NewTail = pcur;
            }
            //链表不为空
            else
            {
                NewTail->next=pcur;//pcur插入到NewTail后 成为新的尾节点
                NewTail=NewTail->next;
            }
            
            
        }
        pcur=pcur->next;
        
        if(NewTail!=NULL)
           NewTail->next=NULL;//一定要置为空,不然像示例一中最后的6 也会输出 因为5对应的next指针指向的是6这个节点
    }        
    return NewHead;
}
相关推荐
mjhcsp25 分钟前
C++ 递推与递归:两种算法思想的深度解析与实战
开发语言·c++·算法
_OP_CHEN31 分钟前
算法基础篇:(三)基础算法之枚举:暴力美学的艺术,从穷举到高效优化
c++·算法·枚举·算法竞赛·acm竞赛·二进制枚举·普通枚举
m0_7482480238 分钟前
《详解 C++ Date 类的设计与实现:从运算符重载到功能测试》
java·开发语言·c++·算法
天选之女wow39 分钟前
【代码随想录算法训练营——Day61】图论——97.小明逛公园、127.骑士的攻击
算法·图论
aloha_7891 小时前
测试开发工程师面经准备(sxf)
java·python·leetcode·压力测试
神仙别闹1 小时前
基于C语言 HTTP 服务器客户端的实验
服务器·c语言·http
im_AMBER1 小时前
Leetcode 47
数据结构·c++·笔记·学习·算法·leetcode
我命由我123451 小时前
Java 并发编程 - Delay(Delayed 概述、Delayed 实现、Delayed 使用、Delay 缓存实现、Delayed 延迟获取数据实现)
java·开发语言·后端·缓存·java-ee·intellij-idea·intellij idea
HLJ洛神千羽1 小时前
C++程序设计实验(黑龙江大学)
开发语言·c++·软件工程
kyle~1 小时前
算法数学---差分数组(Difference Array)
java·开发语言·算法