当前位置: 首页 > news >正文

同ip怎么做不同的网站义乌小商品市场网

同ip怎么做不同的网站,义乌小商品市场网,图片网站建设方案,电子商务主要学什么专业课程​ ​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:数据结构 🎯长路漫漫浩浩,万事皆有期待 文章目录链表OJ题(一)1. 移除…

在这里插入图片描述

​📝个人主页:@Sherry的成长之路
🏠学习社区:Sherry的成长之路(个人社区)
📖专栏链接:数据结构
🎯长路漫漫浩浩,万事皆有期待

文章目录

  • 链表OJ题(一)
    • 1. 移除链表元素
      • 思路一-遍历
        • 一、考虑常见情况
        • 二、考虑特殊情况
          • 1.当链表的第一个结点为待移除的结点时
          • 2.当链表的最后一个结点为待移除的结点时
          • 3.当传入链表为空时
      • 思路二-尾插法
        • 一、考虑常见情况
        • 二、考虑特殊情况
          • 1.当链表的最后一个结点为待删除的结点时
          • 2.当传入链表为空时
          • 2.当要删除所有节点时
      • 思路三-强行加上一个头结点
  • 2.总结:

链表OJ题(一)

1. 移除链表元素

链接:203. 移除链表元素
题目描述:给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
在这里插入图片描述

示例1:
输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]
示例2:
输入:head = [], val = 1
输出:[]
示例3:
输入:head = [7,7,7,7], val = 7
输出:[]

提示:
列表中的节点数目在范围 [0, 104] 内
1 <= Node.val <= 50
0 <= val <= 50

思路一-遍历

要移除链表中值为val的结点,我们肯定是要将链表遍历一遍,关键是我们在遍历的过程中应该如何操作。我们考虑问题的时候,可以先考虑比较常见的情况,再考虑特殊情况。

一、考虑常见情况

要移除某一结点,也就是让该结点的前一个结点指向待移除结点的后一个结点,然后将待移除结点释放即可。我们可以定义3个指针变量:prev,cur,next 。

prev:记录待排查结点的前一个结点位置(previous)。
cur:记录当前正在排查的结点位置(current)。
next:记录待排查结点的后一个结点(next)。
在这里插入图片描述

当cur指针指向的结点并非待移除的结点时,3个结点依次向后移动。
在这里插入图片描述

当cur指针指向待移除的结点时,我们首先让prev指针指向的结点指向next,然后将cur指针指向的结点释放掉
在这里插入图片描述

并将next指针赋值给cur指针,next指针再后移。
在这里插入图片描述

如此进行下去,直到链表遍历完毕,那么值为val的结点也就删除了。

二、考虑特殊情况

常见情况的分析往往只能解决问题的一般情况,并不能解决问题的极端情况。要真正解决问题,我们需要考虑到问题的极端情况。例如,当待移除的结点是第一个结点或是最后一个结点的情况,当链表为空的情况。

1.当链表的第一个结点为待移除的结点时

在这里插入图片描述
这时我们需要先将头指针指向next,然后释放cur指向的结点
在这里插入图片描述
并将next指针赋值给cur指针,next指针再后移。
在这里插入图片描述

2.当链表的最后一个结点为待移除的结点时

当排查到最后一个结点时,cur指向最后一个结点,next指针指向该结点指向的位置,即NULL。
在这里插入图片描述

我们用上面常规情况的方法对其进行分析,发现常规情况的思路适用于这种特殊情况。
在这里插入图片描述
并且发现遍历的终止条件,就是当cur为NULL的时候遍历停止。
在这里插入图片描述

3.当传入链表为空时

我们可以发现,若传入的链表为空链表(NULL),cur指针的值一开始就为空,而我们遍历的终止条件就是当cur为NULL时停止遍历,所以当传入链表为空时,直接执行到函数末尾,即返回头指针(NULL)。

代码实现

struct ListNode {int val;struct ListNode *next;
};struct ListNode* removeElements(struct ListNode* head, int val)
{struct ListNode* prev = NULL;//记录待排查结点的前一个结点位置struct ListNode* cur = head;//记录当前正在排查的结点位置while (cur != NULL)//当cur为空时,循环停止{if (cur->val == val)//当前排查的结点是待移除的结点{struct ListNode* next = cur->next;//记录待排查结点的后一个结点位置if (cur == head)//待移除的结点是链表的第一个结点{head = next;//头指针指向nextfree(cur);//释放第一个结点cur = next;//将next指针赋值给cur指针}else//待移除的结点不是链表的第一个结点{prev->next = next;//prev指针指向的结点指向nextfree(cur);//将cur指针指向的结点释放掉cur = next;//将next指针赋值给cur指针}}else//当前排查的结点不是待移除的结点{prev = cur;//指针后移cur = cur->next;//指针后移}}return head;//返回新的头指针
}

在这里插入图片描述

思路二-尾插法

一、考虑常见情况

还可以通过遍历原链表,将不是val的值尾插到新链表newHead,这时删第一个也没有什么影响,转换成尾插的思路。
定义一个尾指针tail,第一次尾插需要赋值,newHead=tail=cur
在这里插入图片描述
cur->val!=val,尾插进新链表,再更新tail,tail->next=cur,tail=tail->next
在这里插入图片描述

cur->val==val,提前保存下一个节点,释放cur,将下一个赋值给cur
在这里插入图片描述
最后返回newHead

二、考虑特殊情况

在这里插入图片描述

1.当链表的最后一个结点为待删除的结点时

在删除最后一个(6)的时候,上一个节点tail(5)的next还指向(6),删除后就指向野指针了,所以需要tail->next=NULL
在这里插入图片描述

但如果最后一个为(7),便会拿下来尾插,tail->next!=NULL,这时不会出现野指针
在这里插入图片描述

那综合上面两种情况,不如直接置空(tail->next=NULL)吧。但运行后发现还是有问题
在这里插入图片描述

2.当传入链表为空时

在链表为空时,循环根本不会进入,所以还要加一个链表为空的判断if(head==NULL),直接return NULL,不删除了。但运行后发现还是有问题
在这里插入图片描述

2.当要删除所有节点时

若链表全是7的时候,这时所以节点都被删了,没有节点尾插了,newHead和tail还是空,又出现了野指针,所以干脆不判断链表为空,而是判断tail是否为空,若不为空,tail->next=NULL

 * Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
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;
}

在这里插入图片描述

思路三-强行加上一个头结点

我们可能觉得思路一的代码比较复杂,当我们要移除某一个结点时,还需要判断该结点是否为第一个结点,那么有没有什么办法可以不用进行这一步操作呢?
回答是肯定的。办法就是在传入的链表前面强行加上一个头结点,并让链表原来的头指针指向该头结点,这样我们就不用判断待移除的结点是否为第一个结点了(因为现在第一个结点是头结点)。
在这里插入图片描述

在加了头结点后,我们就只需要根据常见情况的逻辑进行代码的编写即可。但是有一点不能忘记,就是在遍历完链表后要将头结点指向的位置(即第一个结点的位置)赋值给头指针,并将头结点释放掉,最后才能返回头指针。
在这里插入图片描述
代码实现

struct ListNode {int val;struct ListNode *next;
};
struct ListNode* removeElements(struct ListNode* head, int val)
{struct ListNode* guard = (struct ListNode*)malloc(sizeof(struct ListNode));//申请一个头结点,返回其地址guard->next = head;//让头结点指向链表的第一个结点struct ListNode* cur = guard->next;//cur指针指向原链表第一个结点struct ListNode* prev = guard;//prev指针指向头结点while (cur != NULL)//当cur为空时,循环停止{if (cur->val == val)//当前排查的结点是待移除的结点{struct ListNode* next = cur->next;//记录待排查结点的后一个结点位置prev->next = next;//prev指针指向的结点指向nextfree(cur);//将cur指针指向的结点释放掉cur = next;//将next指针赋值给cur指针}else//当前排查的结点不是待移除的结点{prev = cur;//指针后移cur = cur->next;//指针后移}}head = guard->next;//将头结点指向的位置赋值给头指针,使头指针指向链表第一个结点free(guard);//释放头结点guard = NULL;//及时置空return head;//返回新的头指针
}

在这里插入图片描述

2.总结:

今天我们通过三种思路分析并完成移除链表元素这道链表OJ题目。总体来说,思路三会相较于前两个思路减少踩坑,但若是第一次遇见,也很难想到。希望我的文章和讲解能对大家的学习提供一些帮助。

当然,本文仍有许多不足之处,欢迎各位小伙伴们随时私信交流、批评指正!我们下期见~

在这里插入图片描述

http://www.yayakq.cn/news/836828/

相关文章:

  • 福田做网站需要多少钱济南智能网站建设费用
  • 扬州广陵区城乡建设局网站互联网巨头是哪几家
  • iis5.1怎么发布网站网站开发语言包括哪些
  • 如何用VS2017做网站株洲在线论坛伴你生活每一天
  • 湖北省和城乡建设厅官方网站石家庄教育学会网站建设
  • 怎么做好网站营销山西网站开发建设
  • 旅游主题网站模板郑州郑东新区
  • 登封做网站优化网络外贸推广
  • 建设mylove卡网站望野眼上海话
  • 可以做行程的网站浙浙江省建设信息港
  • 给客户建完美网站wordpress做什么网站好
  • 数据型网站 建设方案会计证初级报考时间2023年报名
  • 网站开发与软件开发区别业务员客户管理软件
  • 做网站工资高吗centos网站开发
  • 网站和浏览器不兼容网络考试
  • 如何做网站平台关注济南 网站开发
  • 网站开发及建设赔偿条款怎么样自己开网站
  • 网站维护的意义企业网站源码去一品资源网
  • 太原网站优化怎么做网站建设与管理 十四五国规教材
  • 上海高端网站建设定制有什么网站可以做ppt
  • 58招聘网站官网wordpress支付查看更多
  • 网站案例介绍sem推广软件选哪家
  • 东莞工程网站建设公司名称及网址
  • c 网站开发的好处网络服务提供者无正当理由拒绝提供或者拖延
  • asp.net网站开发简明教程网络组建实训报告
  • 引用网站的内容如何做注释wordpress教育主题
  • asp网站发邮件网站模板上传教程
  • 怎样建设凡科网站网站都是用什么语言写的
  • wordpress中文视频插件下载北京seo计费
  • 枣庄三合一网站开发沈阳网页制作设计