力扣日常刷题——(876链表的中间节点、203移除链表元素)

  1. 876.链表的中间节点

题目:876. 链表的中间结点 - 力扣(LeetCode)

①解决思路

方法1:遍历数组一遍后用count记录总节点数,这之后使用count/2再次从头遍历,找到中间节点并返回。

方法2:使用快慢指针,慢指针一次走一步,快指针一次走两步,当快指针走到结束时,慢指针指向的就是中间节点。

②代码实践

因为方法一较为容易实现,这里先实现方法二

struct ListNode* middleNode(struct ListNode* head)
{
    struct ListNode* slow, *fast;
    slow = fast = head;
    
    //fast与fast->next顺序不能调换,因为&&具有短路效应,替换可能会有fast为空指针的情况
    while(fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
    }

    return slow;
}
  1. 203.移除链表元素

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

①解决思路

方法1:用前后两个指针分别指向不同节点,当后面的指针指向的节点值等于目标值时,后面的指针跳过这一节点并将其释放,不断迭代得到最后结果。

方法2:创建一个新链表,不是val值的就尾插在它的后面,反之则不进行。

②代码实践

方法1
struct ListNode* removeElements(struct ListNode* head, int val)
{
    struct ListNode* prev = NULL;
    struct ListNode* cur = head;
    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;
}

方法2
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 = tail->next;
            }

            cur = cur->next;
        }
        else
        {
            struct ListNode* next = cur->next;
            free(cur);
            cur = next;
        }

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

    return newHead;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值