代码随想录算法训练营第四天

● 自己看到题目的第一想法

24.两两交换链表中的节点

  1. 方法:虚拟头节点

  2. 思路:
    设置虚拟头节点dummyhead
    设置临时指针cur = dummyhead; cur每次向前移动两步
    循环条件: cur != nullptr && cur->next != nullptr && cur->next->next !=nullptr
    循环体如图所示:
    在这里插入图片描述

    返回:dummyhead->next;

  3. 注意:

  4. 代码:

/**
* 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:ListNode* swapPairs(ListNode* head) {ListNode* dummyhead = new ListNode(0);dummyhead->next = head;ListNode*cur = dummyhead;while(cur != nullptr && cur->next != nullptr && cur->next->next !=nullptr){ListNode* temp = cur->next;ListNode* temp1 = cur->next->next->next;cur->next = cur->next->next;cur->next->next = temp;cur->next->next->next = temp1;cur = cur->next->next;}return dummyhead->next;}
};
  1. 运行结果:
    在这里插入图片描述

19.删除链表的倒数第 N 个结点

  1. 方法一:
    设置临时指针cur , 找到倒数第n个节点的前一个节点(正着数 的第size-n 个节点),让cur->next = cur->next->next;
    最后返回dummyhead->next;

  2. 思路:

  3. 注意:

  4. 代码:

/**
* 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:ListNode* removeNthFromEnd(ListNode* head, int n) {int size = 0;ListNode * cur = head;while(cur !=nullptr){cur = cur->next;size++;}ListNode* dummyhead = new ListNode(0, head);ListNode * cur1 = dummyhead;for(int i =0; i< size-n; i++){cur1 = cur1->next;}cur1->next = cur1->next->next;return dummyhead->next;}
};
  1. 运行结果:
    在这里插入图片描述

  2. 方法二:双指针

  3. 思路:如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。

  4. 注意:

  5. 代码:

/**
* 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:ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode * dummyhead = new ListNode(0, head);ListNode * fast = dummyhead;ListNode * slow = dummyhead;// while(n-- && fast !=nullptr){//     fast = fast->next;// }for(int i=1; i< n+1; i++){fast = fast->next;}fast = fast->next;while(fast !=nullptr){fast = fast->next;slow = slow->next;}slow->next = slow->next->next;return dummyhead->next;}
};
  1. 运行结果:
    在这里插入图片描述

07.链表相交

面试题 02.07. 链表相交
在这里插入图片描述

  1. 方法: 双指针

  2. 思路:

    定义两个临时指针curA , curB
    求A、B链表的长度
    让curA或者curB走到长度相同的位置
    循环:

    		while(curA != null)    则当curA == curB 时 则  返回 curA  curA = curA->nextcurB = curB->next
    

    否则 返回null

  3. 注意: 两指针相等应为 curA ==curB
    非 curA->val == curB->val && curA->next == curB->next
    在这里插入图片描述
    curA->val == curB->val && curA->next == curB->next 则输出结果为1 而非 8

  4. 代码:

/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     ListNode *next;
*     ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:int getlength(ListNode* cur){int n=0;while(cur !=NULL){cur = cur->next;n++;}return n;}ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {int Alen = getlength(headA);int Blen = getlength(headB);// cout<<Alen<<Blen<<endl;ListNode* curA = headA;ListNode *curB = headB;if(Alen >= Blen ){int extrlenA = Alen -Blen;          while(extrlenA--){curA = curA->next;}  }else{int extrlenB = Blen -Alen;// cout<<extrlenB<<endl;while(extrlenB--){curB = curB->next;               } }while(curA !=NULL){if(curA== curB){return curA;}curA = curA->next;curB = curB->next;}    return NULL;}
};
  1. 运行结果:
    在这里插入图片描述

142.环形链表II

  1. 方法:双指针

  2. 思路:

    1.找到双指针相遇的节点:

    	快指针每次走两步,慢指针每次走一步,若快慢指针相遇,则有环,否则无环。
    

    2.找到环入口:

    从相遇点设置指针index1, 链表头设置指针index2   index1 == index2即为环入口,  则  返回 index2;	
    
  3. 注意:

  4. 代码:

/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     ListNode *next;
*     ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:ListNode *detectCycle(ListNode *head) {// 找到相遇点ListNode * fast = head ;ListNode * slow = head;while(fast !=NULL && fast->next !=NULL && fast->next->next != NULL){fast = fast->next->next;slow = slow->next;if(fast == slow){ListNode * index1 =head;ListNode * index2 = fast;// 找到环入口while(index1 !=index2){index1 = index1->next;index2 = index2->next;}return index1;}// else{//     return NULL;// }}return NULL;}
};
  1. 运行结果:
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/499248.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ntp时钟服务安装- 局域网节点时间同步

场景&#xff1a; 一般部署大数据相关应用服务&#xff0c;各个节点之间需要时间同步&#xff1b;内网情况下&#xff0c;很可能各节点之前时间可能不一致&#xff0c;或者过一段时间后 又不一致了 ntp 时钟服务器&#xff1a; 可用于内网各个节点之前得时间同步&#xff0c;安…

MATLAB环境下使用相关图可视化相关矩阵

为了处理各行各业中出现的高维数据&#xff0c;迫切需要寻找适用的统计学方法。大维随机矩阵理论是处理高维数据的理论工具之一&#xff0c;在高维统计分析中&#xff0c;表现出良好的性能并有着广泛的应用。 二十世纪四十年代和五十年代初期&#xff0c;大维随机矩阵理论起源…

前端,测试,后端,该如何选择?

前端开发&#xff0c;测试&#xff0c;后端&#xff0c;该如何选择&#xff1f;说实话&#xff0c;只要对互联网行业有了解的&#xff0c;都会推荐你学测试。 首先必须声明&#xff0c;能在前端开发、测试、后端&#xff08;主要是Java&#xff09;这三个岗位中进行选择&#…

【Intel oneAPI实战】使用英特尔套件解决杂草-农作物检测分类的视觉问题

目录 一、简介&#xff1a;计算机视觉挑战——检测并清除杂草二、基于YOLO的杂草-农作物检测分类2.1、YOLO简介2.2、基于YOLO的杂草-农作物检测分类解决方案 三、基于YOLO的杂草-农作物检测分类系统设计3.1、基于flask框架的demo应用程序后端3.2、基于Vue框架的demo应用程序前端…

Unity 使用脚本获取组件,代码生成预制体

代码获取组件 using System; using System.Collections; using System.Collections.Generic; using Unity.VisualScripting; using UnityEngine;// 必须要继承 MonoBehaviour 才是一个组件 // 类名必要与文件名一致public class c1 : MonoBehaviour {// 使用 public 初始变量时…

day09_面向对象_构造方法_封装

今日内容 零、 复习昨日 一、构造方法 二、重载 三、封装 零、 复习昨日 1 类和对象是什么关系? 类是模板(原材料)对象是具体实例(成品)类创建出对象 2 类中有什么?(类的成员) 成员属性(成员变量), 成员方法 3 创建对象的语法? 类名 对象名 new 类名(); 4 调用对象属性,方法…

Go开发 入门以VSCode为例

一、Go环境搭建 1.1 安装 进入Golang官网 https://go.dev&#xff0c;点击 Download 若无法打开网页可以使用国内的Go语言中文网 https://studygolang.com/dl 进入下载 找到合适的平台点击链接下载即可&#xff08;这里以Windows距离&#xff09; 下载完成后 Next Next 安…

js 对象总结

文章目录 1、创建对象的6种方式总结一、new 操作符 Object 创建对象二、字面式创建对象 2、js 如何判断对象是否为空3、获取对象长度4、js 遍历对象的 5 种方法1、for … in2、Object.keys(obj)3、Object.values(obj)4、Object.getOwnPropertyNames(obj)5、使用Reflect.ownKey…

C# OpenVINO Nail Seg 指甲分割 指甲检测

目录 效果 模型信息 项目 代码 数据集 下载 C# OpenVINO Nail Seg 指甲分割 指甲检测 效果 模型信息 Model Properties ------------------------- date&#xff1a;2024-02-29T16:41:28.273760 author&#xff1a;Ultralytics task&#xff1a;segment version&#…

VirtualBox虚拟机安装 Linux 系统

要想学习各种计算机技术&#xff0c;自然离不开Linux系统。并且目前大多数生产系统都是安装在Linux系统上。常用的Linux系统有 Redhat&#xff0c;Centos&#xff0c;OracleLinux 三种。 三者的区别简单说明如下&#xff1a; Red Hat Enterprise Linux (RHEL): RHEL 是由美国…

InnoDB锁介绍

本文主要介绍MySQL InnoDB引擎中的各种锁策略和锁类别&#xff0c;并针对记录锁做演示以便于理解。 以下内容适用于MySQL 8.0版本。 读写锁 处理并发读/写访问的系统通常实现一个由两种锁类型组成的锁系统。这两种锁通常被称为共享锁(shared lock)和排他锁(exclusive lock)&…

如何在Window系统部署BUG管理软件并结合内网穿透实现远程管理本地BUG

文章目录 前言1. 本地安装配置BUG管理系统2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射本地服务3. 测试公网远程访问4. 配置固定二级子域名4.1 保留一个二级子域名5.1 配置二级子域名6. 使用固定二级子域名远程 前言 BUG管理软件,作为软件测试工程师的必备工具之一。在…