LeetCode 203. 移除链表元素 | C语言版

LeetCode 203. 移除链表元素 | C语言版

    • LeetCode 203. 移除链表元素
      • 题目描述
      • 解题思路
        • 思路一:使用虚拟指针
          • 代码实现
          • 运行结果
          • 参考文章:
        • 思路二:减少遍历节点数
          • 代码实现
          • 运行结果
          • 参考文章:[]()

LeetCode 203. 移除链表元素

题目描述

题目地址:203. 移除链表元素
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
LeetCode 203. 移除链表元素 | C语言版_第1张图片

解题思路

思路一:使用虚拟指针
代码实现
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* removeElements(struct ListNode* head, int val){
    //使用虚拟头结点进行删除操作(解决删除头结点右移动一位(将头结点向)和删除其他结点操作不同的问题,防止出错)
    //统一删除操作:知道要删除节点的上一个节点,然后将上一节点指向删除节点的下一节点
    struct ListNode* dummyHead=(struct ListNode*)malloc(sizeof(struct ListNode));
    dummyHead->next=head;
    //定义临时指针cur遍历链表
    struct ListNode* cur=dummyHead;

    //dummyHead(cur)->head->
    while(cur->next!=NULL){
        if(cur->next->val==val){
            //记住要删除节点cur->next
            struct ListNode* temp=cur->next;
            //删除cur的下一个节点cur->next(cur的指针域指向节点cur->next->next)
            cur->next=cur->next->next;
            //从内存中清理移除的节点内存
            free(temp);
        }else{
            cur=cur->next;
        }
    }
    //删除操作完成,重新定位头结点
    head=dummyHead->next;
    //清理节点内存
    free(dummyHead);
    return head;
}
运行结果

LeetCode 203. 移除链表元素 | C语言版_第2张图片

参考文章:

https://leetcode.cn/problems/remove-linked-list-elements/solutions/1715614/by-carlsun-2-e4wo/?q=%E4%BB%A3%E7%A0%81%E9%9A%8F%E6%83%B3&orderBy=most_relevant

思路二:减少遍历节点数
代码实现
在这里插入代码片
运行结果
参考文章:

在这里插入图片描述

你可能感兴趣的:(算法,链表,leetcode,c语言)