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

烟台市网站建设电脑培训课程

烟台市网站建设,电脑培训课程,wordpress 免费 模板下载,安徽省工程建设信息网站目录 一、移除链表元素 二、删除排序链表中的重复元素 三、删除排序链表中的重复元素 || 四、删除链表的倒数第 N 个结点 一、移除链表元素 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头…

目录

一、移除链表元素

二、删除排序链表中的重复元素

三、删除排序链表中的重复元素 ||

四、删除链表的倒数第 N 个结点



一、移除链表元素

给你一个链表的头节点 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, 10^4]

  • 1 <= Node.val <= 50

  • 0 <= val <= 50

代码实现一

struct ListNode* removeElements(struct ListNode* head, int val)
{struct ListNode* pre = NULL;struct ListNode* cur = head;while (cur != NULL){if (cur->val == val){if (pre == NULL)  // 当删除的是首元结点时,要做特殊处理,避免访问空指针{head = cur->next;free(cur);cur = head;  // 切不可写成 cur = cur->next}else{pre->next = cur->next;free(cur);cur = pre->next;  // 切不可写成 cur = cur->next}}else{pre = cur;cur = cur->next;}}return head;
}

free(cur); cur = cur->next 是一种类似刻舟求剑的典型的错误写法

代码实现二

struct ListNode* removeElements(struct ListNode* head, int val)
{struct ListNode* newhead = NULL;struct ListNode* tail = NULL;struct ListNode* cur = head;while (cur != NULL){if (cur->val != val){if (newhead == NULL)  // 如果新链表为空{newhead = cur;tail = cur;}else{tail->next = cur;tail = cur;}cur = cur->next;}else{struct ListNode* tmp = cur;cur = cur->next;free(tmp);}}if (tail != NULL)  // 避免对空指针的解引用{tail->next = NULL;  }return newhead;
}

将值不是 val 的结点尾插到新链表中由于尾插需要从头指针出发顺链找到尾结点,时间复杂度高,因此可以用一个尾指针 tail 来记录并更新尾结点的位置

图解示例一

 


二、删除排序链表中的重复元素

给定一个已排序的链表的头 head删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表

示例 1

输入:head = [1,1,2]

输出:[1,2] 

示例 2

输入:head = [1,1,2,3,3]

输出:[1,2,3] 

提示

  • 链表中节点数目在范围 [0, 300]

  • -100 <= Node.val <= 100

  • 题目数据保证链表已经按升序排列

代码实现

struct ListNode* deleteDuplicates(struct ListNode* head) 
{if (head == NULL)  // 判断是否为空表{return NULL;}struct ListNode* tail = head;struct ListNode* cur = head->next;while (cur != NULL){if (cur->val != tail->val){// 尾插tail->next = cur;tail = cur;cur = cur->next;}else{// 删除重复的元素struct ListNode* tmp = cur;cur = cur->next;free(tmp);}}tail->next = NULL;return head;
}


三、删除排序链表中的重复元素 ||

给定一个已排序的链表的头 head删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表

示例 1

 输入:head = [1,2,3,3,4,4,5]

输出:[1,2,5]

示例 2

 输入:head = [1,1,1,2,3]

输出:[2,3]

提示

  • 链表中节点数目在范围 [0, 300]

  • -100 <= Node.val <= 100

  • 题目数据保证链表已经按升序排列

代码实现

struct ListNode* deleteDuplicates(struct ListNode* head)
{struct ListNode* newhead = NULL;struct ListNode* tail = NULL;struct ListNode* cur = head;while (cur != NULL){// 找到第一个值不同于 cur 的结点(也可能为空)struct ListNode* after = cur->next;while (after != NULL && after->val == cur->val){after = after->next;}// 判断 cur 是否属于有重复数字的结点if (cur->next == after)  // 不属于{// 尾插if (newhead == NULL)  // 如果新链表为空{newhead = tail = cur;}else{tail->next = cur;tail = cur;}cur = cur->next;}else  // 属于{while (cur != after){struct ListNode* tmp = cur;cur = cur->next;free(tmp);}}}if (tail != NULL){tail->next = NULL;}return newhead;
}


四、删除链表的倒数第 N 个结点

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

示例 1

 输入:head = [1,2,3,4,5], n = 2

输出:[1,2,3,5]

示例 2

输入:head = [1], n = 1

输出:[]

示例 3

输入:head = [1,2], n = 1

输出:[1]

提示

  • 链表中结点的数目为 sz

  • 1 <= sz <= 30

  • 0 <= Node.val <= 100

  • 1 <= n <= sz

代码实现一

struct ListNode* removeNthFromEnd(struct ListNode* head, int n) 
{struct ListNode* pre_slow = NULL;struct ListNode* slow = head;struct ListNode* fast = head;while (--n){fast = fast->next; // 由于 1 <= n <= sz,所以 fast 不可能走到空}while (fast->next != NULL){pre_slow = slow;slow = slow->next;fast = fast->next;}if (pre_slow == NULL){head = slow->next;free(slow);}else{pre_slow->next = slow->next;free(slow);}return head;
}

相关练习:链表的中间结点、链表中倒数第 k 个结点

代码实现二

struct ListNode* removeNthFromEnd(struct ListNode* head, int n) 
{// 设置一个哨兵位的头结点struct ListNode* guard = (struct ListNode*)malloc(sizeof(struct ListNode));guard->next = head;// 计算链表的长度(包括头结点)int len = 0;struct ListNode* cur = guard;while (cur != NULL){++len;cur = cur->next;}// 找到倒数第 n + 1 个结点(可能是 guard)struct ListNode* pre = guard;for (int i = 0; i < len - n - 1; ++i){pre = pre->next;}// 删除倒数第 n 个结点struct ListNode* tmp = pre->next;pre->next = tmp->next;free(tmp);// 删除哨兵位的头结点并返回 headhead = guard->next;free(guard);return head;
}

设置哨兵位的头结点的好处是便于首元结点的处理

http://www.wooajung.com/news/50.html

相关文章:

  • 网络用户提要求找人帮忙做的网站百度一下你就知道官方网站
  • wordpress single.phpseo关键词优化推广
  • 网站建设及报价格方案网站alexa排名查询
  • 福田瑞沃q5seo排名赚挂机
  • 珠宝网站源码下载万网域名查询注册商
  • 视频网站前台怎么做绍兴seo排名
  • 大连政府建设工程信息网站怎样注册个人网站
  • 在什么网站做兼职翻译sem和seo是什么意思
  • 营销型网站建设比较好种子搜索在线 引擎
  • 精品资料网站项目外包平台
  • 网站维护费用包括哪些南宁seo渠道哪家好
  • 电商网站开发文献综述关键词搜索广告
  • 做网站免费的域名seo基础入门教程
  • 法院ppt做的最好的网站seo是什么岗位的缩写
  • 南宁专业网站开发沙洋县seo优化排名价格
  • 个人的网站深圳市前十的互联网推广公司
  • 做赌博的网站违不违法电脑培训
  • 云服务器建立wordpressseo提升排名
  • wordpress 获取分类文章正规优化公司哪家好
  • 单页销售网站源码正规接单赚佣金的平台
  • 临夏市做网站电话泰州网站排名seo
  • 自己做网站怎么上传到网上成人电脑培训班附近有吗
  • 在线做爰直播网站互动营销用在哪些推广上面
  • 临沂网站推广goldball湖北疫情最新消息
  • 建设部网站1667号公告班级优化大师下载安装app
  • 做网站开发需要什么营销技巧培训
  • 哪个网站做的系统好信息流广告投放渠道
  • WordPress網站放ICP网站技术制作
  • 网站建设如何上传图片seo技术顾问
  • 怎么看待当前政府网站建设软文营销文章案例