C语言------单向链表删除特定值

本文介绍了两种处理链表删除特定值节点的问题的方法:一是遍历并修改原链表,二是逻辑上重建新链表,仅包含非目标节点。
摘要由CSDN通过智能技术生成

 选自力扣题目。

该题有两个解题思路:

1:遍历链表,保存当前节点的地址(list)以及当前节点的上一个节点的地址(prevpos),在遇到待删节点时,令prevpos->next=list->next;

struct ListNode* removeElements(struct ListNode* head, int val) {
    struct ListNode* prevpos = NULL;
    struct ListNode* cur = NULL;
   
        if (head == NULL)//判断头节点是否为空,即是否为空链表
            return head;
		if (head->val == val)//判断是否头节点就是要删除的节点
        {
			while (head->val == val)//可能存在多个连续的节点均为目标节点
			{
				head = head->next;
				if (head == NULL)
					break;
			}
        }
		if (head == NULL)//删除完头节点后可能链表就被删空,所以需要再次判断
			return head;
		struct ListNode* list = head;//如果链表不为空,则创建list
		if(head->val != val)
		{
			while (list != NULL)//遍历链表
			{
				if (list->val == val)//如果遇到目标节点
				{
					cur = head;
					while (cur->val != val)//找到目标节点的前一个节点地址
					{
						prevpos = cur;
						cur = cur->next;
					}
					prevpos->next = list->next;//令目标节点的前一个节点地址指向目标节点的下一个节点地址
				}
				list = list->next;
			}
		}

        return head;//返回头节点

    
}

2.从逻辑上建立新的链表(实质上并没有新创建链表,只是将原链表中非目标节点重新链接起来),建立newhead,tail,cur变量,其中newhead,tail分别模拟xin链表中的头和尾,利用cur遍历原链表,将非目标节点放入新链表中。

struct ListNode* removeElements(struct ListNode* head, int val)
{
	ListNode* newhead = NULL;
	ListNode* tail = NULL;
	ListNode* cur = head;
	while (cur)
	{
		if (cur->val == val)//如果链表第一个节点就是目标节点,则无需“拷贝”,直接释放掉该节点
		{
			struct ListNode* del = cur;
			cur = cur->next;
			free(del);

		}

		else
		{
			if (tail == NULL)//当新链表还没有任何节点插入时
				newhead = tail = cur;
			else //尾插至新链表
			{
				tail->next = cur;
				tail = tail->next;
			}
			cur = cur->next;

		}
	}
	if (tail)//有可能原链表最后一个节点不是目标节点,则tail->next不为空,所以必须有该判断,详情见图
		tail->next = NULL;
	return newhead;
}

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值