力扣 重排链表-143
重排链表-143
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:void reorderList(ListNode* head) {//利用快慢指针找到链表的中点//慢指针走一步,快指针走两步,快指针走到头循环结束后,慢指针的位置就是链表的中点ListNode* slow = head;ListNode* fast = head;while (fast && fast->next) {slow = slow->next;fast = fast->next->next;}//反转链表ListNode* cur = NULL;ListNode* pre = slow->next;slow->next = NULL;//反转链表之前要切断前半部分while (pre != NULL){ListNode* t = pre->next;pre->next = cur;cur = pre;pre = t;}//合并链表,将后半部分反转之后的链表中的每个节点插入到前半部分链表每个节点的中间位置ListNode* h = head;ListNode* c = cur;while (c != NULL) {/*将前半链表和后半部分链表的当前节点的下一个节点保存下来,以便后续的连接操作,因为后面会改变指向,会找不到下一个节点*/ListNode* temph = h->next;ListNode* tempc = c->next;/*将前半部分链表的h节点的下一个节点指向c,将后半部分链表的c节点的下一个节点指向temph,就是前半部分链表的h节点的下一个节点(没指向c节点之前的下一个节点)*/h->next = c;c -> next = temph;/*改变指向过后,更新h和c为原来节点(前半部分链表和后半部分链表都没改变指向之前)的下一个节点*/h = temph;c = tempc;//继续进行循环拼接,直到c为NULL结束循环,则拼接完成} }
};
每日问题
什么是多态性?C++中如何实现多态?多态性的好处是什么?
什么是多态性?
多态性(Polymorphism) 是面向对象编程中的一个重要概念,指的是同一个操作或方法可以作用于不同类型的对象,并表现出不同的行为。它使得一个接口可以根据对象的实际类型进行不同的操作。
多态的两种类型:
1.编译时多态(静态多态,早绑定):
在编译时决定调用哪个函数。
主要通过函数重载(Function Overloading)和运算符重载(Operator Overloading)实现。
2.运行时多态(动态多态,晚绑定):
在运行时根据对象的实际类型来决定调用哪个函数。
主要通过虚函数(Virtual Functions)和继承关系来实现。
C++中如何实现多态?
1. 编译时多态(静态多态)
函数重载(Function Overloading):允许多个同名函数根据参数个数或类型不同而有不同的实现。
#include <iostream>
using namespace std;class Printer {
public:void print(int i) {cout << "Printing int: " << i << endl;}void print(double d) {cout << "Printing double: " << d << endl;}
};int main() {Printer p;p.print(10); // 调用 print(int)p.print(3.14); // 调用 print(double)return 0;
}
运算符重载(Operator Overloading):允许自定义运算符的行为。
#include <iostream>
using namespace std;class Complex {
public:int real, imag;Complex(int r, int i) : real(r), imag(i) {}// 重载加法运算符Complex operator + (const Complex &other) {return Complex(real + other.real, imag + other.imag);}void display() {cout << real << " + " << imag << "i" << endl;}
};int main() {Complex c1(2, 3), c2(4, 5);Complex c3 = c1 + c2; // 调用重载的 + 运算符c3.display(); // 输出: 6 + 8ireturn 0;
}
2. 运行时多态(动态多态)
虚函数(Virtual Function) 和 继承: C++ 的多态性主要通过基类指针或引用指向派生类对象并通过 虚函数 实现。虚函数允许子类重写父类的函数,并在运行时根据对象的实际类型调用相应的函数。
#include <iostream>
using namespace std;// 基类
class Animal {
public:virtual void sound() { // 虚函数cout << "Animal makes a sound" << endl;}
};// 派生类
class Dog : public Animal {
public:void sound() override { // 重写虚函数cout << "Dog barks" << endl;}
};class Cat : public Animal {
public:void sound() override { // 重写虚函数cout << "Cat meows" << endl;}
};int main() {Animal* animal1 = new Dog(); // 基类指针指向派生类对象Animal* animal2 = new Cat(); // 基类指针指向另一个派生类对象animal1->sound(); // 调用 Dog 类的 sound() 函数animal2->sound(); // 调用 Cat 类的 sound() 函数delete animal1;delete animal2;return 0;
}
输出:
Dog barks
Cat meows
在上面的例子中:
sound() 是一个虚函数。
通过基类 Animal 的指针 animal1 和 animal2 来调用派生类 Dog 和 Cat 中的 sound() 方法。
由于 sound() 是虚函数,程序会在运行时动态绑定正确的函数调用(即调用 Dog 或 Cat 类中的重写版本),而不是基类的 sound()。
如何实现运行时多态:
1.虚函数:
在基类中声明函数为 virtual,表示该函数希望被子类重写。
2.重写:
子类通过 override 关键字或仅通过函数签名重写父类的虚函数。
3.多态:
使用基类指针或引用调用虚函数,实际调用的是派生类中的实现。
多态性的好处:
1.代码的扩展性:
多态使得程序在增加新功能时不需要修改现有代码。你可以新增子类,而不需要修改调用基类的代码。
2.提高代码的灵活性和可维护性:
通过多态,程序可以更加灵活地根据对象的实际类型执行不同的操作,减少了条件语句或类型检查。
3.实现接口和抽象:
多态允许定义统一的接口或抽象类,而具体的行为则由不同的子类实现。这可以使得代码在使用时更加一致且易于理解。
4.降低耦合度:
多态性使得不同模块之间的耦合度降低,因为你可以通过基类接口与派生类进行交互,而不需要关心派生类的具体实现。
多态性的注意事项:
1.虚函数的使用:
在基类中定义的虚函数通常需要在派生类中被重写,否则可能会调用基类的实现,导致不符合预期的行为。
2.析构函数:
如果类有虚函数,通常也需要将析构函数定义为虚函数,以确保在删除通过基类指针指向派生类对象时能够正确调用派生类的析构函数,从而避免资源泄漏。
3.性能开销:
使用虚函数可能带来一些性能开销,因为每次调用虚函数时都需要通过虚表(VTable)进行动态查找。
总结:
1.多态性 是面向对象编程的重要特性,允许通过统一的接口操作不同类型的对象,且表现出不同的行为。
2.在 C++ 中,编译时多态通过函数重载和运算符重载实现,运行时多态通过虚函数和继承实现。
3.多态性增强了代码的灵活性、扩展性、可维护性,减少了耦合度。
相关文章:
力扣 重排链表-143
重排链表-143 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), next(next)…...
【Kubernetes理论篇】容器集群管理系统Kubernetes(K8S)
Kubernetes集群部署基本管理实战 这么好的机会,还在等什么! 01、Kubernetes 概述 K8S是什么 K8S 的全称为 Kubernetes (K12345678S),PS:“嘛,写全称也太累了吧,写”。不如整个缩写 K8s 作为缩写的结果…...
Kubernetes 常用操作大全:全面掌握 K8s 基础与进阶命令
Kubernetes(简称 K8s)作为一种开源的容器编排工具,已经成为现代分布式系统中的标准。它的强大之处在于能够自动化应用程序的部署、扩展和管理。在使用 Kubernetes 的过程中,熟悉常用操作对于高效地管理集群资源至关重要。本文将详…...
爬虫基础之Web网页基础
网页的组成 网页可以分为三大部分–HTML、CSS 和 JavaScript。如果把网页比作一个人,那么 HTML 相当于骨架、JavaScript 相当于肌肉、CSS 相当于皮肤,这三者结合起来才能形成一个完善的网页。下面我们分别介绍一下这三部分的功能。 HTML HTML(Hypertext…...
k8s, deployment
控制循环(control loop) for {实际状态 : 获取集群中对象X的实际状态(Actual State)期望状态 : 获取集群中对象X的期望状态(Desired State)if 实际状态 期望状态{什么都不做} else {执行编排动作…...
使用ensp搭建OSPF+BGP和静态路由,底层PC使用dhcp,实现PC互通
1.4种方式,实现PC2可以互通底层的所有设备 OSPF:OSPF是一种用于互联网协议网络的链路状态路由协议 BGP:是一种用于互联网上进行路由和可达性信息传递的外部网关协议(EGP) 静态路由: 静态路由是一种路由方…...
TÜLU 3: Pushing Frontiers in Open Language Model Post-Training
基本信息 📝 原文链接: https://arxiv.org/abs/2411.15124👥 作者: Nathan Lambert, Jacob Morrison, Valentina Pyatkin, Shengyi Huang, Hamish Ivison, Faeze Brahman, Lester James V. Miranda, Alisa Liu, Nouha Dziri, Shane Lyu, Yuling Gu, Sau…...
深入解读 MySQL EXPLAIN 与索引优化实践
MySQL 是当今最流行的关系型数据库之一,为了提升查询性能,合理使用 EXPLAIN 工具和优化索引显得尤为重要。本文将结合实际示例,探讨如何利用 EXPLAIN 分析查询执行计划,并分享索引优化的最佳实践。 一、EXPLAIN 工具简介 EXPLAIN …...
Flume——进阶(agent特性+三种结构:串联,多路复用,聚合)
目录 agent特性ChannelSelector描述: SinkProcessor描述: 串联架构结构图解定义与描述配置示例Flume1(监测端node1)Flume3(接收端node3)启动方式 复制和多路复用结构图解定义描述配置示例node1node2node3启…...
ragflow连ollama时出现的Bug
ragflow和ollama连接后,已经添加了两个模型但是ragflow仍然一直warn:Please add both embedding model and LLM in Settings > Model providers firstly.这里可能是我一开始拉取的镜像容器太小,容不下当前添加的模型,导…...
基于centos7.7编译Redis6.0
背景: OS:CentOs 7.7 Redis: 6.0.6 编译构建报错如下: In file included from server.c:30:0: server.h:1044:5: error: expected specifier-qualifier-list before ‘_Atomic’_Atomic unsigned int lruclock; /* Clock for LRU eviction …...
uni-app项目无法在Android Studio模拟器上运行
目录 1 问题描述2 尝试解决3 引发原因4 解决方法4.1 换用 MuMu 模拟器 5 结语 1 问题描述 在使用 uni-app 开发 Pad 端 App 时,初始化项目后打算先运行一下确保初始化正常。打开 Android Studio 模拟器后,然后在 HbuilderX 中选择使用 App 标准基座 运…...
第一部分:Linux系统(基础及命令)
Linux操作系统的实操性非常强,纯操作,不适用于日常的办公使用 1.初始Linux 1.1 操作系统概述 1.1.1 了解OS的作用 OS:是计算机软件的一种,主要负责:作为用户和计算机硬件之间的桥梁,调度和管理计算机硬…...
No module named ‘_ssl‘ No module named ‘_ctypes‘
如果你使用的是基于 yum 的 Linux 发行版(例如 CentOS、RHEL、Fedora),安装 libc6-dev 的方式稍有不同。在这些系统中,通常对应的包是 glibc-devel。 No module named ‘_ctypes’ 使用 yum 安装 glibc-devel 更新系统的软件包列…...
【QT】编写第一个 QT 程序 对象树 Qt 编程事项 内存泄露问题
目录 1. 编写第一个 QT 程序 1.1 使用 标签 实现 🐇 图形化界面实现 🐇 纯代码形式实现 1.2 使用 按钮 实现 🐋 图形化界面实现 🐋 纯代码形式实现 1.3 使用 编辑框 实现 🥝 图形化界面实现 ᾕ…...
VTK编程指南<六>:VTK可视化管线与渲染详解
1、VTK渲染引擎 回顾前几章节的RenderCylinder示例 可以找到以下的类: vtkProp; ytkAbstractMapper; vtkProperty; vtkCamera; vtkLight; vtkRenderer; vtkRenderWindow; vtkRenderWindowInteractor vtkTransform; vtkLookupTable;可以发现这些类都是与数据显示或渲染相关的。…...
基于STM32的智能计步器
引言 随着健康意识的提高,计步器逐渐成为人们日常生活中重要的健康管理工具。本文将指导你如何使用STM32微控制器制作一个智能计步器。该计步器通过加速度传感器检测步伐,并使用OLED显示屏显示步数。通过这个项目,你将学习到STM32开发的基本流…...
VB.NET 从入门到精通:开启编程进阶之路
摘要: 本文全面深入地阐述了 VB.NET 的学习路径,从基础的环境搭建与语法入门开始,逐步深入到面向对象编程、图形用户界面设计、数据访问、异常处理、多线程编程以及与其他技术的集成等核心领域,通过详细的代码示例与理论讲解&…...
射频电路屏蔽简略
电磁波的干扰是每个射频设备的自带属性,不管是内部还是外部,怎样去更好的抑制掉干扰,关系到射频设备的工作状态,而能够找到产生干扰的来源就是重中之重,电磁波的干扰与其产生的源密不可分,而源就离不开所需…...
基础算法——搜索与图论
搜索与图论 图的存储方式2、最短路问题2.1、Dijkstra算法(朴素版)2.2、Dijkstra算法(堆优化版)2.3、Bellman-Ford算法2.4、SPFA求最短路2.5、SPFA判负环2.6、Floyd算法 图的存储方式 2、最短路问题 最短路问题可以分为单源最短路…...
redis优化编码之字符串
redis 优化编码之字符串 ### 字符串优化 字符串对象是redis内部最常用的数据类型。 所有的键是字符串对象值对象除了整数之外都是使用字符串存储lpush cache:type "redis" "tair" "memcache" "leveldb"创建如上一个链表 需要创建一…...
Python特定版本的安装/卸载/环境配置,Spyder安装教程
目录 1.Python安装 1.1 Python下载 1.2 下载特定版本 1.3 安装Python 1.4 修改安装 1.5 环境配置 1.6 卸载Python 2.Spyder安装使用 2.1 Spyder下载 2.1.1 官网下载Spyder 2.2.2 Github下载Spyder 2.2 安装 参考资料:网盘 1.Python安装 1.1 Python下载…...
全局搜索正则表达式(grep)
一.grep简介 grep 全程Globally search a Regular Expression and Print,是一种强大的文本搜索工具,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行。Unix的grep家族包括grep和egrep 二.grep的工作…...
linux-12 关于shell(十一)ls
登录系统输入用户名和密码以后,会显示给我们一个命令提示符,就意味着我们在这里就可以输入命令了,给一个命令,这个命令必须要可执行,那问题是我的命令怎么去使用,命令格式有印象吗?在命令提示符…...
编写指针函数使向右循环移动m个位置
题目描述:有n个整数,要求你编写一个函数使其向右循环移动m个位置 请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。 输入 输入n m表示有n个整数,移动m位 输出 输出移动后的数组 样例输入: 10 5 1 2 3…...
xvisor调试记录
Xvisor是一种开源hypervisor,旨在提供完整、轻量、移植且灵活的虚拟化解决方案,属于type-1类型的虚拟机,可以直接在裸机上启动。 启动xvisor步骤: 1、搭建riscv编译环境 首先从github上下载riscv-gnu-toolchain很费劲,建议直接从国内的源下载 git clone https://gitee…...
MongoDB-ObjectID 生成器
前言 MongoDB中一个非常关键的概念就是 ObjectID,它是 MongoDB 中每个文档的默认唯一标识符。了解 ObjectID 的生成机制不仅有助于开发人员优化数据库性能,还能帮助更好地理解 MongoDB 的设计理念。 什么是 MongoDB ObjectID? 在 MongoDB …...
CUDA 计时功能,记录GPU程序/函数耗时,cudaEventCreate,cudaEventRecord,cudaEventElapsedTime
为了测试GPU函数的耗时,可以使用 CUDA 提供的计时功能:cudaEventCreate, cudaEventRecord, 和 cudaEventElapsedTime。这些函数可以帮助你测量某个 CUDA 操作(如设置设备)所花费的时间。 一、记录耗时案例 以下是一个示例程序&a…...
PDF 文件如何转为 CAD 图纸?PDF2CAD 使用教程
在工程设计和建筑行业中,PDF 文件常常被用来分享和存档图纸。然而,当需要对这些图纸进行编辑或进一步开发时,静态的 PDF 格式就显得力不从心了。这时候,将 PDF 文件转换为可编辑的 CAD(计算机辅助设计)格式…...
【YashanDB知识库】php查询超过256长度字符串,数据被截断的问题
本文内容来自YashanDB官网,原文内容请见:https://www.yashandb.com/newsinfo/7488290.html?templateId1718516 问题现象 如下图,php使用odbc数据源,查询表数据,mysql可以显示出来,yashan显示数据被截断。…...
保温管有哪些网站做/产品关键词
2019独角兽企业重金招聘Python工程师标准>>> html <!doctype html> <html lang"en"> <head> <meta charset"UTF-8"> <title>基于css3的鼠标滑动按钮动画</title> </head> …...
怎样把自己的网站做推广/企业网站代运营
前置知识 #define pi acos(-1.0) 是因为 acos为cos的反函数 cos(pi)-1 使用三角函数都要换为弧度制,角度制*pi/180弧度制 C1. Simple Polygon Embedding 题目大意 给定一个边长为 1 的正 2n 边形,求外接正方形的最小面积,n为…...
做c语言题目的网站/智能识别图片
Writer:BYSocket(泥沙砖瓦浆木匠)一、前言针对并发,老生常谈了。目前一个通用的做法有两种:锁机制:1.悲观锁;2.乐观锁。但是这篇我主要用于记录我这次处理的经历,另外希望能看的大神,大牛&#…...
盘县做会计兼职的网站/windows优化大师的功能
所以我花了2小时以来百思不得其解自己,为什么这不会工作,我遵循了上述问题的所有代码,但尚未对我来说仍然不会工作我是什么做错了?我在一个正方形添加,以确保它是越来越向线和实际工作function Shape(a,b,w,h,fill){th…...
台州经典网站建设费用/关键词首页优化
本书介绍 从通信网络到量子化学,图结构的数据在自然科学和社会科学中无处不在。如果我们希望系统能够从这类数据中学习、推理和归纳,那么将关系推理能力建模到深度学习架构中是至关重要的。近年来,关于图表示学习的研究激增,包括深…...
wordpress用户名是哪个文件/军事新闻头条最新消息
1.确保PIP的存在2.CMD命令进入C:\Python34\Scripts里面后再执行PIP命令安装pip install wheel # D: 和cd 地址3.把文件最好放在\Script文件夹里面再pip install xxxx.whl4.注意whl文件名不能改 必须一模一样和原名当然如果网上有包的话你可以直接pip install…...