大魔王(已黑化)

大魔王(已黑化)

初刷leetcode题目(7)——数据结构与算法-LMLPHP
初刷leetcode题目(7)——数据结构与算法-LMLPHP

七、203. 移除链表元素

初刷leetcode题目(7)——数据结构与算法-LMLPHP

思路

代码

第一种

//解法1.双指针(跳过并释放不符合的结点)
struct ListNode* removeElements(struct ListNode* head, int val){
    struct ListNode* cur = head;
    struct ListNode* prev = NULL;
    while(cur)
    {
        if(cur->val!=val)
        {
            prev = cur;
            cur = cur->next;
        }
        else
        { 
            if(prev==NULL)//如果第一个就相同,那么让head改变,不能改变prev,prev只是赋上了head的值,它的指向改变并不影响head的指向,后面不用这样是因为结构体指针可以改变结构体内部的内容。
            {
                head = head->next;
                free(cur);
                cur = head;//头指针变了,cur也要跟着变。
            }
            else
            {
                prev->next = cur->next;
                free(cur);
                cur = prev->next;
            }
        }
    }
    if(head!=NULL)//如果最后一个元素为val,那么释放后该链表最后指向的就会是被释放的空间,所以赋上NULL;
        prev->next = NULL;
    return head;
}

第二种

//解法2.创建一个新的链表(虽然还是指向这块链表,但是这次是让他们看作都没连接,让符合条件的重新串起来),然后将满足条件的尾插过去。其实可以看作第一种是两个指针在一个链表上操作,这个可以看作是两个指针都分别操纵一个链表,让符合条件的重新连接起来。
struct ListNode* removeElements(struct ListNode* head, int val) {
    struct ListNode* cur, * tail, * newhead;
    cur = head;
    tail = newhead = NULL;
    while (cur)
    {
        if (cur->val != val)
        {
            if (newhead == NULL)
            {
                newhead = tail = cur;
                cur = cur->next;
            }
            else
            {
                tail->next = cur;
                tail = cur;
                cur = tail->next;
            }
        }
        else
        {
            struct ListNode* next = cur->next;
            free(cur);
            cur = next;
        }
    }
    if(tail)
        tail->next = NULL;
    return newhead;
}
  • 博主长期更新,博主的目标是不断提升阅读体验和内容质量,如果你喜欢博主的文章,请点个赞或者关注博主支持一波,我会更加努力的为你呈现精彩的内容。

初刷leetcode题目(7)——数据结构与算法-LMLPHP

11-21 15:38