c/c++补完计划(七): 哨兵节点
时间:2022-07-23
本文章向大家介绍c/c++补完计划(七): 哨兵节点,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前言
解决链表问题, 经常会用一个空的节点进行辅助.
合并两个排序的链表
可以先考虑递归, 新建一个节点, 然后选择两个链表里面小的, 链到新建的节点. 之后移动被选择的链表, 递归这个问题.
ListNode *Merge(ListNode *pHead1, ListNode *pHead2) {
if (pHead1 == nullptr) {
return pHead2;
}
if (pHead2 == nullptr) {
return pHead1;
}
ListNode *merge;
if (pHead1->val < pHead2->val) {
merge = pHead1;
merge->next = Merge(pHead1->next, pHead2);
} else {
merge = pHead2;
merge->next = Merge(pHead1, pHead2->next);
}
return merge;
}
说实话, 这个方案在力库上跑了下, 整体表现还可以. 不比非递归差多少.
那么非递归的思路也是一样, 新建一个节点, 每次对比两个链的值, 选择小的链上. 最后把剩余没跑完的, 一次性链接即可.
auto before = new ListNode(0);
auto cur = before;
while (l1 != nullptr && l2 != nullptr) {
if (l1->val < l2->val) {
cur->next = l1;
l1 = l1->next;
} else {
cur->next = l2;
l2 = l2->next;
}
cur = cur->next;
}
cur->next = l1 != nullptr ? l1 : l2;
return before->next;
这里用到了一个哨兵节点, 等于保留了前一个节点的位置, 让问题简化很多.
反转链表
但是上面的问题, 这个点还不明显, 反转链表就很需要这样一个哨兵节点了.
ListNode *ReverseList(ListNode *head) {
if (head == nullptr) {
return nullptr;
}
ListNode *ret = nullptr;
auto move = head;
while (move) {
auto next = move->next;
move->next = ret;
ret = move;
move = next;
}
return ret;
}
先保存当前点的next位置, 让next指到哨兵节点, 然后把当前位置赋值到哨兵节点, 等于是手动让其前进一步, 最后手动让当前节点走到其next. 其实就是双指针, 但是移动全靠手动赋值罢了.
最后
不是难题, 甚至没做过也能一下子ac, 不过从链表来看, 还是有价值的题目.
- 多线程编程学习二(对象及变量的并发访问).
- ASM基本配置问题(r5笔记第89天)
- 如何上手使用 Facebook 的开源平台 Detectron?
- 多线程编程学习三(线程间通信).
- 关于create database语句在10g,11g中的不同(r5笔记第88天)
- Web开发模式【Mode I 和Mode II的介绍、应用案例】
- 多线程编程学习四(Lock 的使用)
- Android编程规范
- 干货 | 深入分析Object.wait/notify实现机制
- 关于ORA-01555的问题分析(r5笔记第87天)
- 项目工具类
- AJAX常见面试题
- 干货 | Tomcat类加载机制触发的Too many open files问题分析
- 并行查询缓慢的问题分析(r5笔记第86天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux下进程数量的限制pid_max的配置方法
- linux 进程数最大值修改方法
- Linux通过设备号找到设备的方法
- linux环境下安装 openOffice 并启动服务 的方法
- Linux下如何查杀stopped进程详解
- Linux文件服务器实战详解(匿名用户)
- ubuntu16.0.4 设置固定ip地址的方法
- Linux文件服务器实战详解(虚拟用户)
- Linux CentOS下安装Tomcat9及web项目的部署
- Linux文件服务器实战详解(系统用户)
- 关于bash函数你可能不知道的一些事情(译)
- Linux Centos7系统端口占用问题的解决方法
- Linux中利用sudo进行赋权的方法详解
- Centos7下用户登录失败N次后锁定用户禁止登陆的方法
- Linux服务器被黑以后的详细处理步骤