【快乐手撕LeetCode题解系列】——移除链表元素

简介: 哈喽各位友友们😊,我今天又学到了很多有趣的知识,现在迫不及待的想和大家分享一下!😘我仅已此文,和大家分享【快乐手撕LeetCode题解系列】——移除链表元素~ 都是精华内容,可不要错过哟!!!😍😍😍

微信图片_20230427214238.gif

😎博客昵称:博客小梦

😊最喜欢的座右铭:全神贯注的上吧!!!

😊作者简介:一名热爱C/C++,算法等技术、喜爱运动、热爱K歌、敢于追梦的小博主!

😘博主小留言:哈喽!😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮助,话不多说,文章推上!欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!😘微信图片_20230427160707.gif


前言🙌



    哈喽各位友友们😊,我今天又学到了很多有趣的知识现在迫不及待的想和大家分享一下!😘我仅已此文,和大家分享【快乐手撕LeetCode题解系列】——移除链表元素~ 都是精华内容,可不要错过哟!!!😍😍😍


删除有序数组中的重复项🙌


题目内容


微信图片_20230428195337.png


解法一:


画图分析:😍


微信图片_20230428195440.png

微信图片_20230428195445.png


思路分析:😍


  • 1.首先先认真读题,分析出解题的思路
  • 2.这里要定义一个prev指针,这个是关键。保存cur前一个结点的位置。
  • 3.如果cur指向的值不为val,就让prev保留这个位置,再让cur指向下一个位置
  • 4.让cur指向的值为val,就要进行删除。一般的情况下就是将prev-> next = cur - > next,然后将cur指向的结点释放掉,最后再将cur 指向prev->next;
  • 5.当cur = NULL时,遍历完这个单链表了。循环结束,将head返回即可。


源代码分享:😍


struct ListNode* removeElements(struct ListNode* head, int val)
{
    struct ListNode* prev = NULL;
    struct ListNode* cur = head;
    while(cur)
    {
        //删除
        if(cur->val  == val)
        {
            if(cur == head)
            {
                head = cur->next;
                free(cur);
                cur = head;
            }
            else
            {
                prev->next = cur->next;
                free(cur);
                cur = prev->next;
            }
        }
        else
        {
            prev = cur;
            cur = cur->next;
        }
    }
    return head;
}


解法二:


画图分析:😍


微信图片_20230428195641.png


思路分析:😍


  • 1.这里是利用插入的思想来解决这道题目
  • 2.插入的时候也要注意一点,一般的情况都是进行尾插的,但是要注意只有一个节点的时候是进行头插操作的。
  • 3.当cur指向的值不为val就让插入到新的链表中。让tail->next = cur ; tail->next = cur。这是一般的情况,如果是头插的话就得让head = tail = cur。
  • 4.如果当cur指向的值为val,就得定义一个指针del保留cur的位置,然后将cur指向下一个。把del指向的空间删除即可
  • 5.注意野指针和空指针的问题。当最后一个元素是val,将其free掉后,tail->next就是个野指针了。需要将其置为NULL。当链表的值都为val,将链表全部删除后,head就是个野指针了。需要将其置为NULL。


源代码分享:😍


struct ListNode* removeElements(struct ListNode* head, int val)
{
    struct ListNode*cur = head;
    struct ListNode*tail = NULL;
    head = NULL;
    while(cur)
    {
        if(cur->val != val)
        {
            //头插
            if(tail == NULL)
            {
               head = tail = cur;
            }
            //尾插
            else
            {
                tail->next = cur;
                tail = tail->next;
            }
            cur = cur->next;
        }
        else
        {
             struct ListNode*del = cur;
             cur = cur->next;
             free(del);
        }
    }
    if(tail != NULL && tail->next != NULL)
    tail->next = NULL;
    return head;
}


解法三:


画图分析:😍


微信图片_20230428195727.png


思路分析:😍


  • 1.这里先建立一个带头结点的空链表。这是对第二种解法的一种简化。比较方便插入,这里就无需将头插分开讨论了,都是尾插。
  • 2.其他的思路都和第二种解法相似就不过多赘述。
  • 3.需要注意的是,如果末尾的数据为val,当删除最后一个结点后。需要将tail->next置为空。
  • 4.返回的不是head,而是head->next。因为head是不带值的头,其后面那个才是有效的结点。


源代码分享:😍


struct ListNode* removeElements(struct ListNode* head, int val)
{
   struct ListNode* tail = NULL;
   struct ListNode* cur = head;
   //带哨兵位的头结点
   head = tail = (struct ListNode*)malloc(sizeof(struct ListNode));
   while(cur)
   {
       if(cur->val == val)
       {
           struct ListNode*del = cur;
           cur = cur->next;
           free(del);
       }
       else
       {
           tail->next = cur;
           tail = tail->next;
           cur = cur->next;
       }
   }
   if(tail != NULL && tail->next != NULL)
   {
       tail->next = NULL;
   }
   return head->next;
}


程序输出结果验证: 😊


微信图片_20230428195821.png


总结撒花💞


   本篇文章旨在分享【【快乐手撕LeetCode题解系列】——移除链表元素。希望大家通过阅读此文有所收获!😘如果我写的有什么不好之处,请在文章下方给出你宝贵的意见😊。如果觉得我写的好的话请点个赞赞和关注哦~😘😘😘

相关文章
|
6天前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
16 1
|
13天前
Leetcode第21题(合并两个有序链表)
这篇文章介绍了如何使用非递归和递归方法解决LeetCode第21题,即合并两个有序链表的问题。
34 0
Leetcode第21题(合并两个有序链表)
|
12天前
【LeetCode 27】347.前k个高频元素
【LeetCode 27】347.前k个高频元素
23 0
|
13天前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
12 0
LeetCode第二十四题(两两交换链表中的节点)
|
13天前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
32 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
27天前
01_移除链表元素
01_移除链表元素
|
13天前
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
27 0
|
13天前
【LeetCode 10】142. 环形链表 II
【LeetCode 10】142. 环形链表 II
16 0
|
13天前
【LeetCode 09】19 删除链表的倒数第 N 个结点
【LeetCode 09】19 删除链表的倒数第 N 个结点
12 0
|
13天前
【LeetCode 08】206 反转链表
【LeetCode 08】206 反转链表
11 0