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

力扣 重排链表-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集群部署基本管理实战 这么好的机会&#xff0c;还在等什么&#xff01; 01、Kubernetes 概述 K8S是什么 K8S 的全称为 Kubernetes (K12345678S)&#xff0c;PS&#xff1a;“嘛&#xff0c;写全称也太累了吧&#xff0c;写”。不如整个缩写 K8s 作为缩写的结果…...

Kubernetes 常用操作大全:全面掌握 K8s 基础与进阶命令

Kubernetes&#xff08;简称 K8s&#xff09;作为一种开源的容器编排工具&#xff0c;已经成为现代分布式系统中的标准。它的强大之处在于能够自动化应用程序的部署、扩展和管理。在使用 Kubernetes 的过程中&#xff0c;熟悉常用操作对于高效地管理集群资源至关重要。本文将详…...

爬虫基础之Web网页基础

网页的组成 网页可以分为三大部分–HTML、CSS 和 JavaScript。如果把网页比作一个人&#xff0c;那么 HTML 相当于骨架、JavaScript 相当于肌肉、CSS 相当于皮肤&#xff0c;这三者结合起来才能形成一个完善的网页。下面我们分别介绍一下这三部分的功能。 HTML HTML(Hypertext…...

k8s, deployment

控制循环&#xff08;control loop&#xff09; for {实际状态 : 获取集群中对象X的实际状态&#xff08;Actual State&#xff09;期望状态 : 获取集群中对象X的期望状态&#xff08;Desired State&#xff09;if 实际状态 期望状态{什么都不做} else {执行编排动作&#xf…...

使用ensp搭建OSPF+BGP和静态路由,底层PC使用dhcp,实现PC互通

1.4种方式&#xff0c;实现PC2可以互通底层的所有设备 OSPF&#xff1a;OSPF是一种用于互联网协议网络的链路状态路由协议 BGP&#xff1a;是一种用于互联网上进行路由和可达性信息传递的外部网关协议&#xff08;EGP&#xff09; 静态路由&#xff1a; 静态路由是一种路由方…...

TÜLU 3: Pushing Frontiers in Open Language Model Post-Training

基本信息 &#x1f4dd; 原文链接: https://arxiv.org/abs/2411.15124&#x1f465; 作者: 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 是当今最流行的关系型数据库之一&#xff0c;为了提升查询性能&#xff0c;合理使用 EXPLAIN 工具和优化索引显得尤为重要。本文将结合实际示例&#xff0c;探讨如何利用 EXPLAIN 分析查询执行计划&#xff0c;并分享索引优化的最佳实践。 一、EXPLAIN 工具简介 EXPLAIN …...

Flume——进阶(agent特性+三种结构:串联,多路复用,聚合)

目录 agent特性ChannelSelector描述&#xff1a; SinkProcessor描述&#xff1a; 串联架构结构图解定义与描述配置示例Flume1&#xff08;监测端node1&#xff09;Flume3&#xff08;接收端node3&#xff09;启动方式 复制和多路复用结构图解定义描述配置示例node1node2node3启…...

ragflow连ollama时出现的Bug

ragflow和ollama连接后&#xff0c;已经添加了两个模型但是ragflow仍然一直warn&#xff1a;Please add both embedding model and LLM in Settings &#xff1e; Model providers firstly.这里可能是我一开始拉取的镜像容器太小&#xff0c;容不下当前添加的模型&#xff0c;导…...

基于centos7.7编译Redis6.0

背景&#xff1a; OS&#xff1a;CentOs 7.7 Redis: 6.0.6 编译构建报错如下&#xff1a; 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 时&#xff0c;初始化项目后打算先运行一下确保初始化正常。打开 Android Studio 模拟器后&#xff0c;然后在 HbuilderX 中选择使用 App 标准基座 运…...

第一部分:Linux系统(基础及命令)

Linux操作系统的实操性非常强&#xff0c;纯操作&#xff0c;不适用于日常的办公使用 1.初始Linux 1.1 操作系统概述 1.1.1 了解OS的作用 OS&#xff1a;是计算机软件的一种&#xff0c;主要负责&#xff1a;作为用户和计算机硬件之间的桥梁&#xff0c;调度和管理计算机硬…...

No module named ‘_ssl‘ No module named ‘_ctypes‘

如果你使用的是基于 yum 的 Linux 发行版&#xff08;例如 CentOS、RHEL、Fedora&#xff09;&#xff0c;安装 libc6-dev 的方式稍有不同。在这些系统中&#xff0c;通常对应的包是 glibc-devel。 No module named ‘_ctypes’ 使用 yum 安装 glibc-devel 更新系统的软件包列…...

【QT】编写第一个 QT 程序 对象树 Qt 编程事项 内存泄露问题

目录 1. 编写第一个 QT 程序 1.1 使用 标签 实现 &#x1f407; 图形化界面实现 &#x1f407; 纯代码形式实现 1.2 使用 按钮 实现 &#x1f40b; 图形化界面实现 &#x1f40b; 纯代码形式实现 1.3 使用 编辑框 实现 &#x1f95d; 图形化界面实现 &#x1f95…...

VTK编程指南<六>:VTK可视化管线与渲染详解

1、VTK渲染引擎 回顾前几章节的RenderCylinder示例 可以找到以下的类: vtkProp; ytkAbstractMapper; vtkProperty; vtkCamera; vtkLight; vtkRenderer; vtkRenderWindow; vtkRenderWindowInteractor vtkTransform; vtkLookupTable;可以发现这些类都是与数据显示或渲染相关的。…...

基于STM32的智能计步器

引言 随着健康意识的提高&#xff0c;计步器逐渐成为人们日常生活中重要的健康管理工具。本文将指导你如何使用STM32微控制器制作一个智能计步器。该计步器通过加速度传感器检测步伐&#xff0c;并使用OLED显示屏显示步数。通过这个项目&#xff0c;你将学习到STM32开发的基本流…...

VB.NET 从入门到精通:开启编程进阶之路

摘要&#xff1a; 本文全面深入地阐述了 VB.NET 的学习路径&#xff0c;从基础的环境搭建与语法入门开始&#xff0c;逐步深入到面向对象编程、图形用户界面设计、数据访问、异常处理、多线程编程以及与其他技术的集成等核心领域&#xff0c;通过详细的代码示例与理论讲解&…...

射频电路屏蔽简略

电磁波的干扰是每个射频设备的自带属性&#xff0c;不管是内部还是外部&#xff0c;怎样去更好的抑制掉干扰&#xff0c;关系到射频设备的工作状态&#xff0c;而能够找到产生干扰的来源就是重中之重&#xff0c;电磁波的干扰与其产生的源密不可分&#xff0c;而源就离不开所需…...

基础算法——搜索与图论

搜索与图论 图的存储方式2、最短路问题2.1、Dijkstra算法&#xff08;朴素版&#xff09;2.2、Dijkstra算法&#xff08;堆优化版&#xff09;2.3、Bellman-Ford算法2.4、SPFA求最短路2.5、SPFA判负环2.6、Floyd算法 图的存储方式 2、最短路问题 最短路问题可以分为单源最短路…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

什么是VR全景技术

VR全景技术&#xff0c;全称为虚拟现实全景技术&#xff0c;是通过计算机图像模拟生成三维空间中的虚拟世界&#xff0c;使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验&#xff0c;结合图文、3D、音视频等多媒体元素…...

LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)

在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...

前端高频面试题2:浏览器/计算机网络

本专栏相关链接 前端高频面试题1&#xff1a;HTML/CSS 前端高频面试题2&#xff1a;浏览器/计算机网络 前端高频面试题3&#xff1a;JavaScript 1.什么是强缓存、协商缓存&#xff1f; 强缓存&#xff1a; 当浏览器请求资源时&#xff0c;首先检查本地缓存是否命中。如果命…...

41道Django高频题整理(附答案背诵版)

解释一下 Django 和 Tornado 的关系&#xff1f; Django和Tornado都是Python的web框架&#xff0c;但它们的设计哲学和应用场景有所不同。 Django是一个高级的Python Web框架&#xff0c;鼓励快速开发和干净、实用的设计。它遵循MVC设计&#xff0c;并强调代码复用。Django有…...

HTML中各种标签的作用

一、HTML文件主要标签结构及说明 1. <&#xff01;DOCTYPE html> 作用&#xff1a;声明文档类型&#xff0c;告知浏览器这是 HTML5 文档。 必须&#xff1a;是。 2. <html lang“zh”>. </html> 作用&#xff1a;包裹整个网页内容&#xff0c;lang"z…...

20250609在荣品的PRO-RK3566开发板的Android13下解决串口可以执行命令但是脚本执行命令异常的问题

20250609在荣品的PRO-RK3566开发板的Android13下解决串口可以执行命令但是脚本执行命令异常的问题 2025/6/9 20:54 缘起&#xff0c;为了跨网段推流&#xff0c;千辛万苦配置好了网络参数。 但是命令iptables -t filter -F tetherctrl_FORWARD可以在调试串口/DEBUG口正确执行。…...

C/Python/Go示例 | Socket Programing与RPC

Socket Programming介绍 Computer networking这个领域围绕着两台电脑或者同一台电脑内的不同进程之间的数据传输和信息交流&#xff0c;会涉及到许多有意思的话题&#xff0c;诸如怎么确保对方能收到信息&#xff0c;怎么应对数据丢失、被污染或者顺序混乱&#xff0c;怎么提高…...