首页 > 编程语言 >代码随想录算法训练营第4天 | 24. 两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交,142.环形链表II,链表总结篇

代码随想录算法训练营第4天 | 24. 两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交,142.环形链表II,链表总结篇

时间:2025-01-11 17:55:20浏览次数:1  
标签:head ListNode nullptr 随想录 next 链表 节点

一、刷题部分

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

1.1.1 题目描述

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

示例 1:

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

示例 2:

输入:head = []
输出:[]

示例 3:

输入:head = [1]
输出:[1]

提示:

  • 链表中节点的数目在范围 [0, 100]
  • 0 <= Node.val <= 100

1.1.2 初见想法

这其实是上一题的更复杂版本,每一次更改需要涉及交换的 2 个节点以及前后 2 个节点共 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) {
        //考虑节点个数为0或1的情况
        if (head == nullptr) {
            return head;
        }
        if (head -> next == nullptr) {
            return head;
        }
        ListNode* pre = nullptr;
        ListNode* cur1 = head;
        ListNode* cur2 = head -> next;
        ListNode* nxt = nullptr;
        head = cur2;
        
        //开始交换
        while (true) {
            nxt = cur2 -> next;

            //考虑一开始pre节点是nullptr的情况
            if (pre != nullptr) {
                pre -> next = cur2;
            }
            cur2 -> next = cur1;
            cur1 -> next = nxt;

            //若本次是最后一次
            if (nxt == nullptr || nxt -> next == nullptr) {
                break;
            }

            //确定不是最后一遍循环可以放心地节点指针整体后移2位
            pre = cur1;
            cur1 = nxt;
            cur2 = nxt -> next;
        }

        return head;
    }
};

也确实如我所料,写起来流畅并且运行通过。接下来看看录里有没有新东西。

1.1.3 看录后想法

感觉录里的写法总是比我简洁呢,虽然思路都是差不多的。把 pre 和 nxt 作为两个临时指针,只关心 cur1 和 cur2的操作,剩下的两个指针每次更新就行。

1.1.4 遇到的困难

标签:head,ListNode,nullptr,随想录,next,链表,节点
From: https://www.cnblogs.com/xuchiblog/p/18666048

相关文章

  • 如何查找两个DOM节点的最近公共父节点
    在前端开发中,如果你需要找到两个DOM节点的最近公共父节点,可以使用JavaScript提供的DOMAPI来实现。以下是一个简单的函数,该函数接受两个DOM节点作为参数,并返回它们的最近公共父节点:functionfindClosestCommonParent(node1,node2){//获取节点1的所有父节点c......
  • 3.1.链表
    链表链表是一种常见的基础数据结构,它由一系列节点组成,这些节点不必在内存中相连,而是通过指针相互连接,形成一个链式结构。以下是链表的详细定义:节点结构:链表中的每个节点至少包含两个部分,即数据域和指针域。数据域:用于存储节点的数据,可以是各种数据类型,例如整数、字符、字......
  • List详解 - 双向链表的操作
    在C++中,std::list是标准模板库(STL)中的一个容器,它实现了双向链表的数据结构。与数组或向量(std::vector)不同,std::list允许在常数时间内进行插入和删除操作,尤其是在链表的任意位置。本文将详细介绍std::list的基本操作,并通过示例代码帮助读者理解其使用方法。1. std::list 的基......
  • LeetCode:141.环形链表
    //双指针快+1=慢trueclassListNode{constructor(val,next){this.val=(val===undefined?0:val)this.next=(next===undefined?null:next)}}varhasCycle=function(head){letfast=headletslow=headwhile(......
  • 代码随想录算法训练营day16(0109)
    很痛苦,也是对自己放松的一种惩罚吧!大半夜的冻着脚在这里写算法,最难受的是还不会写!!!!1.找树左下角的值层序遍历比较简单,但是递归有点不太明白怎么整。因为要的是最后一行的最左边的值。递归首先是要明白怎么获得我们想要的左下角,其实就是最底层的左边,那么可以确定的是只要先左......
  • 服务器多节点 Grafana、Prometheus 和 Node-Exporter Docker版本部署指南
    要在多台服务器上部署Grafana、Prometheus和Node-Exporter,并且其中一台服务器专门用于Grafana和Prometheus的部署1.准备工作服务器信息:Server1:用于部署Grafana和Prometheus。Server2-n:用于部署Node-Exporter。Docker:确保所有服务器上已安装Docker......
  • LeetCode:83.删除排序链表中的重复元素
    LeetCode:83.删除排序链表中的重复元素classListNode{constructor(val,next){this.val=(val===undefined?0:val)this.next=(next===undefined?null:next)}}vardeleteDuplicates=function(head){letp=head//head......
  • 力扣21、合并两个有序链表
    目录1、题目2、思路3、代码若有错误,欢迎指正! 1、题目将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例1:输入:l1=[1,2,4],l2=[1,3,4]输出:[1,1,2,3,4,4]示例2:输入:l1=[],l2=[]输出:[]示例......
  • 数据结构——单链表(C语言版:超详细)
    目录一、引言1.数据结构的重要性2.单链表在其中的地位二、什么是单链表1.单链表的定义2.基本概念解释三、单链表的结构特点1.与数组对比的优势2.存在的劣势四、单链表的基本操作1.节点的创建2.动态申请一个节点3.插入节点3.1尾插3.2头插3.3在pos之前插入3.4在......
  • 【Web】0基础学Web—节点操作、发表神评妙论、事件添加和移除、事件冒泡和事件捕获
    0基础学Web—节点操作、发表神评妙论、事件添加和移除、事件冒泡和事件捕获节点操作创建节点末尾追加子节点插入节点将一个节点插入到一个父元素的最前面删除节点替换节点发表神评妙论案例cssbodyjs事件添加和移除事件监听事件冒泡和捕获节点操作创建节点<script......