【每日一题】移除链表元素(C语言)

移除链表元素,链接奉上

目录

思路:

正常 情况:

下我们移除链表元素时,需要该位置的前结点与后节点

特别 情况时:

例如

我们发现,需要改变头结点,否则因为返回的head因为指向的位置被free,会导致程序错误

代码实现:

c 复制代码
struct ListNode* removeElements(struct ListNode* head, int val) 
{
    struct ListNode* prev = NULL;
    struct ListNode* cur = head;
    while(cur)
    //当cur为NULL时自动结束
    {
        if(cur->val == val)
        //分别判断cur->val的情况
        {
            struct ListNode* next = cur->next;
            free(cur);
            if(!prev)
            {
             //当prev为NULL时改变head
                head = next;
            }
            else
            {
                prev->next = next;
            }
            cur = next;

        }
        else
        {
            prev = cur;
            cur = cur->next;
        }
    }
    return head;
}

链表题目小技巧:

我们调试时可以在VS或其他的软件进行调试,也不用专门搞一个链表:

可以创建一个如下的main函数,根据题目要求进行调试

c 复制代码
int main()
{
	struct ListNode* n1 = (ListNode*)malloc(sizeof(ListNode));
	struct ListNode* n2 = (ListNode*)malloc(sizeof(ListNode));
	struct ListNode* n3 = (ListNode*)malloc(sizeof(ListNode));
	struct ListNode* n4 = (ListNode*)malloc(sizeof(ListNode));
	struct ListNode* n5 = (ListNode*)malloc(sizeof(ListNode));
	if (!(n1 && n2 && n3 && n4 && n5))
	{
		perror("malloc");
		return -1;
	}
	n1->next = n2;
	n2->next = n3;
	n3->next = n4;
	n4->next = n5;
	n5->next = NULL;

	n1->val = 1;
	n2->val = 2;
	n3->val = 3;
	n4->val = 4;
	n5->val = 5;
	
	return 0;
}
相关推荐
无限远的弧光灯1 小时前
c语言学习_函数递归
c语言·开发语言·学习
小林C语言2 小时前
C语言 | 指针小结
c语言
黎明smaly3 小时前
【排序】插入排序
c语言·开发语言·数据结构·c++·算法·排序算法
YuTaoShao4 小时前
【LeetCode 热题 100】206. 反转链表——(解法一)值翻转
算法·leetcode·链表
YuTaoShao4 小时前
【LeetCode 热题 100】142. 环形链表 II——快慢指针
java·算法·leetcode·链表
CCF_NOI.4 小时前
(普及−)B3629 吃冰棍——二分/模拟
数据结构·c++·算法
LIN-JUN-WEI5 小时前
[ESP32]VSCODE+ESP-IDF环境搭建及blink例程尝试(win10 win11均配置成功)
c语言·开发语言·ide·vscode·单片机·学习·编辑器
神的孩子都在歌唱5 小时前
3423. 循环数组中相邻元素的最大差值 — day97
java·数据结构·算法
艾莉丝努力练剑7 小时前
【C语言】学习过程教训与经验杂谈:思想准备、知识回顾(三)
c语言·开发语言·数据结构·学习·算法
黑听人7 小时前
【力扣 困难 C】115. 不同的子序列
c语言·leetcode