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

简介: 力扣(链接放这里喽)

力扣(链接放这里喽)09c40322cdc942608d943f27c86b5453.png

先贴代码再做讲解:

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;
}

ec2dee96178949cea8cef3a59e351771.png


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


我们假设有上述这种情况,按照题目设想,前面三个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;
}


目录
相关文章
|
3月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
47 1
|
5月前
|
程序员
【刷题记录】移除链表元素
【刷题记录】移除链表元素
|
3月前
|
存储
链表题目练习及讲解(下)
链表题目练习及讲解(下)
43 9
|
3月前
|
存储 Java
数据结构第三篇【链表的相关知识点一及在线OJ习题】
数据结构第三篇【链表的相关知识点一及在线OJ习题】
39 7
|
3月前
链表题目练习及讲解(上)
链表题目练习及讲解(上)
38 1
01_移除链表元素
01_移除链表元素
|
3月前
【LeetCode 06】203.移除链表元素
【LeetCode 06】203.移除链表元素
39 0
|
5月前
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
|
6月前
【数据结构OJ题】环形链表
力扣题目——环形链表
45 3
【数据结构OJ题】环形链表
|
6月前
【数据结构OJ题】复制带随机指针的链表
力扣题目——复制带随机指针的链表
60 1
【数据结构OJ题】复制带随机指针的链表