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

arcengine网站开发网站内容添加

arcengine网站开发,网站内容添加,做网站新闻,买了域名就可以做网站对于无头单向不循环链表,给出头结点head与数值val,删除链表中数据值val的所有结点 #define ListNodeDataType val struct ListNode { struct ListNode* psll;ListNodeDataType val; } 方法一---遍历删除 移除所有数值为val的链表结点,…

对于无头单向不循环链表,给出头结点head与数值val,删除链表中数据值=val的所有结点

#define ListNodeDataType val 
struct ListNode
{    struct ListNode* psll;ListNodeDataType val;
}

方法一---遍历删除

移除所有数值为val的链表结点,那么我们就需要遍历寻找val值为val的结点,然后由于需要删除,因此还需要前一个结点来链接删除结点的后一个结点。

我们创建prev与cur指针,cur指针用于遍历寻找存储数值为val的结点,prev指针用于链接下一个结点。

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

优先讨论一般情况,当cur->val与val相等时,说明我们需要删除cur指向的结点,那么我们需要先将prev指向结点中存储的next指针指向待删除结点的下一个结点cur->next,即prev->next=cur->next,然后再释放cur指向结点。由于释放完我们需要将cur指向后一个结点,如果首结点val相等,删除首结点,那么如果不创建新指针指向后一个结点我们无法完成cur指向修改操作。

如果cur->val与val不相等,那么我们就将prev与cur指针一前一后向后移动即可。

    while(cur!=NULL){if(cur->val==val){struct ListNode* next = cur->next;if(prev)prev->next = next;elsehead = cur->next;free(cur);cur = next;}else{prev = cur;cur=cur->next;}}return head;

如果prev为NULL,那就说明首结点是待删除结点,那么我们需要更改head指向,不能再使用prev->next!这是个空指针的非法访问。

整体代码如下:

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

方法二---拿出不需要删除的结点放入新的链表

那么我们需要创建一个新的头指针anotherhead,然后需要有一个指针变量cur2来遍历插入结点。

    struct ListNode* cur1 = head;struct ListNode* cur2 = NULL;struct ListNode* anotherhead = NULL;

我们通过cur1指针遍历原链表,拿出不需要删除的结点,如果是第一个不删除的结点那么就让anotherhead与cur2均指向该结点,后面就动cur2即可,anotherhead就能够保证不为NULL,指向第一个不删除的结点空间。对于第一个不删除的结点,转换为if条件就是cur2==NULL或者anotherhead==NULL,当两者仍然是NULL,而循环中进入了cur1->val != val的if表达式,那么就需要对头指针another和cur2两者进行赋值。cur1遍历到val值的结点就释放并记录下一个结点位置。

    while (cur1){if (cur1->val != val){if (cur2 == NULL){anotherhead = cur1;cur2 = cur1;}else{cur2->next = cur1;cur2 = cur2->next;}cur1 = cur1->next;}else{struct ListNode* prev = cur1;cur1 = cur1->next;free(prev);prev = NULL;}}

但是循环结束并没有完成这个删除操作,因为最后cur2指向的结点中的next指针的指向没有修改。也就是尾结点存储的next指针不一定为NULL,我们需要在循环结束后将cur2->next置空。同时,考虑周全,如果给你的是一个空链表,cur2->next岂不是非法访问?因此还要进行一次if的条件判断,cur2不为空时才将尾结点的next指针置空,最后返回anotherhead或者把anotherhead赋给head返回head。

    if (cur2 != NULL)cur2->next = NULL;return anotherhead;

方法三---创建哨兵位头结点newhead

    struct ListNode* newhead = (struct ListNode*)malloc(sizeof(struct ListNode));struct ListNode* cur2 = newhead;

开辟一个哨兵位的空间,好处是最后不用使用条件判断cur2是否为NULL,因为cur2最不济也指向哨兵位,不可能出现空指针的解引用操作;当然坏处是,最后由于要释放空间需要额外创建指针存放newhead->next地址,释放newhead空间,再返回我们的首结点地址。

大体与方法二其实差不多。

struct ListNode* removeElements(struct ListNode* head, int val)
{struct ListNode* cur1 = head;struct ListNode* newhead = (struct ListNode*)malloc(sizeof(struct ListNode));struct ListNode* cur2 = newhead;while (cur1){if (cur1->val != val){cur2->next = cur1;cur2 = cur2->next;cur1 = cur1->next;}else{struct ListNode* prev = cur1;cur1 = cur1->next;free(prev);prev = NULL;}}cur2->next = NULL;//下面释放开辟的哨兵位空间struct ListNode* tmp = newhead;newhead = newhead->next;free(tmp);tmp = NULL;return newhead;
}

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

相关文章:

  • 天津营销网站建设公司排名图案设计制作
  • 深喉咙企业网站帮助顺德网站建设渠道
  • 沧州有做网站的吗风溪商城是那个网站建设的
  • 外贸网站分类pc端和移动端的网站区别是什么
  • 常德网站建设 天维优秀品牌形象设计案例
  • 萍乡商城网站建设现在推广引流什么平台比较火
  • 国外logo设计网站推荐一键seo提交收录
  • asp.net 网站的编译初学者学做网站怎么学
  • 便宜营销型网站建设优化建站营销型网站结构图
  • php网站开发技术题目多用户商城购物系统
  • 长春网站制作外包ysl 官网中国
  • 网站策划方案详解纺织服装网站建设规划方案
  • 企业网站页头背景图钛钢饰品网站建设
  • 做网站代理需要办什么营业执照巩义便宜网站建设价格
  • 制作网站注册登录模块的思维导图网站开发和运营维护
  • 氧os哪个网站做的最好西安公司的网站建设
  • 椒江区建设局网站字幕如何做模板下载网站
  • 网站开发人员绩效考核网站开发报价文件
  • 大良招聘网站建设旅游网络营销
  • 鹿泉城乡建设局网站懒设计官网
  • 网站用哪些系统做的好中国纪检监察报投稿
  • 网站建设企业需要符合哪些建网易企业邮箱注册官网
  • 请简述企业网站的推广阶段及其特点有什么网站有教师招聘考试题目做
  • asp 网站运行建一个app要多少钱
  • 南通e站网站建设自动app优化官网
  • 济南网站建设优化公司网络用户管理系统
  • 南宁个人做网站的上海哪家公司可以做网站
  • 四川建设网站官网ios软件下载网站
  • 网站搭建怎么弄的慈溪建设网站
  • 网站建设目的及功能定位关于单位建设网站的申请