今日写题04work

题目:移除链表元素

今日写题04work_第1张图片

今日写题04work_第2张图片

两种实现思路

思路一

使用双指针,prev,cur快慢指针解决。当cur不等于val,两个指针跳过。当等于val时,要考虑两种情况,一种是pos删,一种是头删除。

pos删除就是正常情况,但头删是一种特殊情况,比如第一个数据就是等于val。所以,我们在这里分类处理。

今日写题04work_第3张图片

struct ListNode* removeElements(struct ListNode* head, int val) {
    struct ListNode* cur=head,*prev=NULL;
    while(cur)
    {
        if(cur->val!=val)
        {
            prev=cur;
            cur=cur->next;
        }
        else
        {
            if(prev==NULL)
            {
                head=cur->next;
                free(cur);
                cur=head;
            }
            else
            {
                prev->next=cur->next;
                free(cur);
                cur=prev->next;
            }
        }
    }
    return head;
}

思路二

尾插到新链表,如果不等于val,尾插到新链表。如果等于val,那就头删。末尾记得把tail的next置空,否则如果最后一个数据要删除的话,那tail的next就成了野指针。还有两种特殊情况,空链表和全等于val。

空链表

tail等于空指针,如果末尾在使用就是空指针引用。

全等于val

这时全部头删,没有一个结点尾插。那tail还是空指针,末尾使用就是空指针引用。

这两种情况都是空指针引用错误。所以,我们可以在末尾加一个if语句,判断tail是否为空。

如果为空,就不执行。如果不为空,那就执行。

最后记得return的是新的头指针,newHead。

今日写题04work_第4张图片

​
struct ListNode* removeElements(struct ListNode* head, int val) {
    struct ListNode* newHead=NULL,*tail=NULL;
    struct ListNode* cur=head;
    while(cur)
    {
        if(cur->val != val)
        {
            if(tail==NULL)
            {
                newHead=tail=cur;
            }
            else
            {
                tail->next=cur;
                tail=cur;
            }
            cur=cur->next;
        }
        else
        {
            struct ListNode* next=cur->next;
            free(cur);
            cur=next;
        }
    }
    if(tail)
    {
        tail->next=NULL;
    }
    return newHead;
}

​

题目链接:203. 移除链表元素 - 力扣(LeetCode)

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