Leetcode 【203】 移除链表元素 C语言

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

Leetcode 【203】 移除链表元素 C语言_第1张图片

示例 1:
输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]
示例 2:

输入:head = [], val = 1
输出:[]
示例 3:

输入:head = [7,7,7,7], val = 7
输出:[]

思路:对于这个题用暴力解法来判断很多情况,来解决。但是昨天学到了可以用带一个头结点来取消这个对于头结点的判断,直接一个指针指到跟 val 值相等节点的前驱,然后用前驱的next连到next的next上面去。

struct ListNode* removeElements(struct ListNode* head, int val){
    struct ListNode* HeadNode = (struct ListNode*)malloc(sizeof(struct ListNode));
    HeadNode->next = head;
    struct ListNode* cur = HeadNode;
    while(cur->next){
        if(cur->next->val == val){
            cur->next = cur->next->next;
        }
        else{
            cur = cur->next;
        }
    }
    return HeadNode->next;
}

这段代码的可读性很差,不如试试双指针?

struct ListNode* removeElements(struct ListNode* head, int val){
    struct ListNode* HeadNode = (struct ListNode*)malloc(sizeof(struct ListNode));
    HeadNode->next = head;
    struct ListNode* cur = HeadNode->next;
    struct ListNode* prev = HeadNode;
    while(cur){
        if(cur->val == val){
            prev->next = cur->next;
        }
        else{
            prev = cur;
        }
        cur = cur->next;
    }
    return HeadNode->next;
}

 对于链表他有天然的递归性,可以试着用栈,或者递归来操作一下。

struct ListNode* removeElements(struct ListNode* head, int val){
    if(NULL == head){
        return NULL;
    }
    struct ListNode* ret = removeElements(head->next,val);
    if(head->val == val){
        return ret;
    } 
    else {
        head->next = ret;
        return head;
    }
}

你可能感兴趣的:(C语言刷题,leetcode,c语言,算法,数据结构)