链表OJ题目1 (移除链表元素)

力扣(链接放这里喽)

链表OJ题目1 (移除链表元素)_第1张图片

 先贴代码再做讲解:

struct ListNode* removeElements(struct ListNode* head, int val)
{

    struct ListNode* cur = head;
    struct ListNode* tail = NULL;
    while(cur)
    {

        if(cur->val == val)
        {
            if(cur == head)
            {
                head = head->next;
                free(cur);
                cur = head;
            }              
            else
            {
                tail->next = cur->next;
                free(cur);
                cur = tail->next;
            }
                
        }
        else
        {         
            tail = cur;
            cur = cur->next;         
        }

    }

    if(tail)
        tail->next = NULL;

    return head;
}

 

 

我们应该先将情况考虑周全,画图分析思路 :

我们假设有上述这种情况,按照题目设想,前面三个6都应该free掉,从3这个位置开始,也就是说我们要返回的头就从此处开始,所以我们先考虑值相等,过掉再继续。

在这个位置,要有一个继续往后走的指针,和保存头部位置的指针,以及一个保存尾部的指针来连接后面的5,因为head确定后就不会再动了,而遍历指针过掉中间的6时,3与5是不相接的,要连接只能说找尾指针。

还有第二种思路,就是值不相等就拿下来,值相等就跳过,free掉:

struct ListNode* removeElements(struct ListNode* head, int val)
{

    struct ListNode* cur = head;
    struct ListNode* temp = NULL;
    struct ListNode* tail = NULL;
    while(cur)
    {
        if(cur->val == val)
        {
            temp = cur;
            cur = cur->next;
            free(temp);
        }          
        else    
        {
            if(tail == NULL)
                head = tail = cur;
            else   
            {
                 tail->next = cur;
                 tail = cur;
            }        
                      
            cur = cur->next;
        }
    }

    if(tail)
        tail->next = NULL;
    if(tail == NULL)
        return NULL;

    return head;
}

你可能感兴趣的:(数据结构,C语言,链表,数据结构)