移除链表元素

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

一、思路

1.

遍历链表,删除掉等于val的节点;但是删除掉当前节点,就不能把链表串起来了,所以需要一个prev指针,使链表不断开。(双指针

2.

创建新的头节点,将原链表内不等于val的节点拿下来尾插。 但是每次拿下来尾插,在单链表中需要找尾,时间复杂度为 O(n²) ,效率太低。所以新添加一个尾指针,记录尾插后 链表的尾指针,可以将时间复杂度降为O(n)。

二、代码如下

思路一:

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

    struct ListNode* prev = NULL,* cur = head;

   

    while(cur)

    {

        if(cur->val == val)

        {

            if(prev != NULL)

            {

                prev->next = cur->next;

                free(cur);

                cur = prev->next;

            }

            else

            {

                cur = head->next;

                free(head);

                head = cur;

            }

        }

        else

        {

            prev = cur;

            cur = cur->next;    

        }

    }

    return head;

}

**********这里面需要考虑到,当 prev == NULL 与 prev != NULL时的指针情况***********************

思路二:

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

    struct ListNode* new = NULL,* cur = head,*tail = NULL;

    while(cur)

    {

        if(cur->val != val)

        {

            if(new == NULL)

            {

                new = tail = cur;

            }

            else

            {

                tail->next = cur;

                tail = tail->next;

            }

        cur = cur->next;

        tail->next = NULL;

        }

        else

        {

            struct ListNode* del = cur;

            cur = cur->next;

            free(del);

        }

    }

    return new;

}

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

注意:

1.当尾插第一个与其他个时,要分开讨论.

2.当尾插完后,tail->next要置空。

否则在这种情况下,尾插完2后,最后一个6会释放掉,但是 2 节点的指针还是指向6,但6已经被释放,导致野指针

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值