当前位置:   article > 正文

单链表OJ题:LeetCode--203.移除链表元素

单链表OJ题:LeetCode--203.移除链表元素

朋友们、伙计们,我们又见面了,今天给大家带来的是LeetCode中203题:移除链表元素

数据结构:数据结构专栏

作       者:stackY、

C  语 言 :C语言专栏

LeetCode--203.移除链表元素:https://leetcode.cn/problems/remove-linked-list-elements/

目录

1.题目介绍 

2.实例演示 

3.解题思路 

3.1直接删除法:

3.2尾插法 


1.题目介绍 

 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

2.实例演示 

 

3.解题思路 

小编在这里给大家分享两中解题思路:

1.找到val结点的前一个结点,然后将val结点释放,将val结点的前一个结点的next指向val结点的后一个结点。

2.将不是val结点的结点进行尾插。

3.1直接删除法:

①找到val结点的前一个结点,然后将val结点释放,将val结点的前一个结点的next指向val结点的后一个结点:

②这里要注意一个点,如果第一个结点就是要删除的结点,那么就得考虑prev的NULL指针访问:

代码演示:

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * struct ListNode *next;
  6. * };
  7. */
  8. struct ListNode* removeElements(struct ListNode* head, int val){
  9. struct ListNode* cur = head;
  10. struct ListNode* prev = NULL;
  11. while(cur)
  12. {
  13. //找到要删除的结点
  14. if(cur->val == val)
  15. {
  16. //判断prev是否为空
  17. if(prev == NULL)
  18. {
  19. //若为空,可直接删除
  20. //直接指向头节点的下一个结点
  21. cur = head->next;
  22. //然后将头结点释放
  23. free(head);
  24. //更新头节点
  25. head = cur;
  26. }
  27. //如果prev不为空
  28. else
  29. {
  30. //将prev的next指向cur的next
  31. prev->next = cur->next;
  32. //将cur释放
  33. free(cur);
  34. //更新cur
  35. cur = prev->next;
  36. }
  37. }
  38. //如果cur不是要删除的结点
  39. else
  40. {
  41. //记录cur的前一个结点
  42. prev = cur;
  43. //让cur指向下一个结点
  44. cur = cur->next;
  45. }
  46. }
  47. //将删除后的链表返回
  48. return head;
  49. }

3.2尾插法 

 ①将不是val的结点进行尾插,这时要设置一个新的头和一个新的尾,每一次插入都要将尾结点更新一下,最后返回新的头结点。

②要注意第一次尾插的时候的NULL指针,当每一次进行尾插之后,插入的结点的next还是于原链表有联系,所以我们每一次插入之后需要将尾结点的next置为空,或者可以将结点尾插完之后将尾结点的next置为NULL,这样就避免了最后一次插入之后的尾结点与原链表的关联。

代码演示:

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * struct ListNode *next;
  6. * };
  7. */
  8. struct ListNode* removeElements(struct ListNode* head, int val) {
  9. struct ListNode* cur = head;
  10. struct ListNode* newhead = NULL;
  11. struct ListNode* tail = NULL;
  12. while (cur)
  13. {
  14. //判断是否是要删除的结点
  15. if (cur->val != val)
  16. {
  17. //第一次尾插
  18. if (tail == NULL)
  19. {
  20. newhead = tail = cur;
  21. }
  22. else
  23. {
  24. //尾插
  25. tail->next = cur;
  26. //更新尾
  27. tail = tail->next;
  28. }
  29. //判断下一个结点
  30. cur = cur->next;
  31. }
  32. //要删除的结点
  33. else
  34. {
  35. //先保存要删除的结点
  36. struct ListNode* del = cur;
  37. //然后指向下一个结点
  38. cur = cur->next;
  39. //将要删除的结点释放掉
  40. free(del);
  41. }
  42. }
  43. //断开最后一个结点与原链表的联系,置为空
  44. if (tail != NULL)
  45. {
  46. tail->next = NULL;
  47. }
  48. return newhead;
  49. }

今天的博客就分享到这里,喜欢的老铁留下你的三连,感谢感谢!我们下期再见!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/499128
推荐阅读
相关标签
  

闽ICP备14008679号