LeetCode203-移除链表元素(哨兵位头节点法重点解释)

本文介绍了如何删除链表中所有值为val的节点,提供了哨兵位头节点法和前驱指针法两种解决方案。哨兵位头节点法通过创建一个额外的节点作为头节点的前驱,简化了对头节点的判断;前驱指针法则利用前驱节点删除当前节点,避免了对头节点的特殊处理。两种方法都有效地实现了链表的修改。
摘要由CSDN通过智能技术生成

题目描述

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

说明

在这里插入图片描述

题目分析

题目已知head头节点,val = 6。
在这里插入图片描述

解法:哨兵位头节点

预设工作,确定各节点

struct ListNode* guardHead = (struct ListNode*)malloc(sizeof(struct ListNode));
    guardHead->next = head;
    struct ListNode* cur = head;
    struct ListNode* prev = guardHead;

第一步:
在这里插入图片描述
第二步:cur->val != val 继续迭代。
在这里插入图片描述
第三步:cur->val == val
在这里插入图片描述
代码:

if(cur->val == val)
{
	struct ListNode* next = cur->next;
	prev->next = next;
    free(cur);
    cur = next;                
}
else 
{
    prev = cur;
    cur = cur->next;
}        

第四步:val 在结尾特殊判断
在这里插入图片描述
第五步:返回语句特殊判断
在这里插入图片描述

head = guardHead->next;
free(guardHead);
return head;

整体代码

struct ListNode* removeElements(struct ListNode* head, int val){
    struct ListNode* guardHead = (struct ListNode*)malloc(sizeof(struct ListNode));
    guardHead->next = head;
    struct ListNode* cur = head;
    struct ListNode* prev = guardHead;

    while(cur)
    {       if(cur->val == val)
            {
                struct ListNode* next = cur->next;
                prev->next = next;
                free(cur);
                cur = next;
            }
            else 
            {
                prev = cur;
                cur = cur->next;
            }    
    }
    head = guardHead->next;
    free(guardHead);
    return head;
}

其他解法(前驱指针法)

参考链接移除链表元素代码链接
代码:

struct ListNode* removeElements(struct ListNode* head, int val){
    struct ListNode* cur = head;
    struct ListNode* prev = NULL;

    while(cur)//cur控制循环体结束
    {
        if(cur->val == val)// find it
        {
            struct ListNode* next = cur->next;
			
			//头节点是val 需要单独判断
            if(prev == NULL)//cur 前的prev为空 cur是头
            {
                free(cur);
                head = next;
                cur = next;
            }
            else //cur不是头 要删除的不是头结点
            {
                prev->next = next;
                free(cur);
                cur = next;
            }
        }
        
		//没找到val ,继续迭代找val相等的节点
        else
        {
            prev = cur;
            cur = cur->next;
        }
    }
    return head;
}

这里选取待哨兵位头节点的原因是防止了上述代码方法对头节点的单独判断。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值