首页 > 编程语言 >刷题笔记——单向链表(C++)

刷题笔记——单向链表(C++)

时间:2024-01-06 18:03:39浏览次数:28  
标签:head ListNode cur C++ next 链表 节点 刷题

206. 反转链表 - 力扣(LeetCode)

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

刷题笔记——单向链表(C++)_学习笔记

解题思路

三指针。temp指针用于存储当前节点的下一节点,pre指针用于存储当前节点反转后指向的新节点。具体操作如下:

刷题笔记——单向链表(C++)_数据结构与算法_02

反转过程:

刷题笔记——单向链表(C++)_学习笔记_03

刷题笔记——单向链表(C++)_学习笔记_04

刷题笔记——单向链表(C++)_C++_05

代码实现

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if(!head || !head->next){
            return head;
        }
        ListNode *pre = NULL;
        ListNode *cur = head;
        ListNode *tmp;
        while(cur){
            tmp = cur->next;
            cur->next = pre;
            pre = cur;
            cur = tmp;
        }
        return pre;
    }
};

24. 两两交换链表中的节点 - 力扣(LeetCode)

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

刷题笔记——单向链表(C++)_学习笔记_06

解题思路

递归。题干中的意思是对链表中的节点每两个进行互换,那么我们可以把前两个进行互换,后边剩余的视为一个整体,放入到下一层递归中。具体操作如下:

刷题笔记——单向链表(C++)_数据结构与算法_07

代码实现

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        if(!head||!head->next){
            return head;
        }
        ListNode *cur=head, *next=head->next;
        ListNode *nextNext = swapPairs(next->next);
        cur->next = nextNext;
        next->next = cur;
        return next;
    }
};

25. K 个一组翻转链表 - 力扣(LeetCode)

给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

刷题笔记——单向链表(C++)_C++_08

解题思路

其实就是上边两道题结合起来,话不多说,直接上代码。

代码实现

class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        if(!head || k == 1){
            return head;
        }
        ListNode *cur = head;
        // 1、先判断是否为最后部分(是则直接返回head保持原有顺序)
        for(int i = 0; i < k; i++){
            if(!cur){
                return head;
            }
            cur = cur->next;
        }
        // 2、翻转k-1个指针
        cur = head;
        ListNode *pre = nullptr, *tmp = nullptr;
        for(int i = 0; i < k; i++){    
            tmp = cur->next;
            cur->next = pre;
            pre = cur;
            cur = tmp;
        }
        // 3、反转后和原链表进行连接
        head->next = reverseKGroup(cur, k);
        return pre;
    }
};

LCR 154. 复杂链表的复制 - 力扣(LeetCode)

请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null

刷题笔记——单向链表(C++)_C++_09

解题思路

迭代+拆分。首先将复制链表中的每个节点,插入到原链表中;随后,将旧节点的random指向传递给新的节点,最后拆分新旧链表,具体操作如下:

刷题笔记——单向链表(C++)_C++_10

刷题笔记——单向链表(C++)_C++_11

刷题笔记——单向链表(C++)_C++_12

刷题笔记——单向链表(C++)_学习笔记_13

代码实现

class Solution {
public:
    Node* copyRandomList(Node* head) {
        if(!head){
            return head;
        }
        Node *cur = head;
        // 1、复制链表中的每个节点
        while(cur){
            Node *tmp = new Node(cur->val);
            tmp->next = cur->next;
            cur->next = tmp;
            cur = tmp->next;
        }
        // 2、将旧节点的random指向传递给新的节点
        cur = head;
        while(cur){
            if(cur->random){
                cur->next->random = cur->random->next;
            }
            cur = cur->next->next;
        }
        // 3、拆分链表
        cur = head->next;
        Node *pre = head, *res = head->next;
        while(cur->next){
            pre->next = pre->next->next;
            cur->next = cur->next->next;
            pre = pre->next;
            cur = cur->next;
        }
        pre->next = nullptr;
        return res;
    }
};

面试题 02.07. 链表相交 - 力扣(LeetCode)

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。

图示两个链表在节点 c1 开始相交

刷题笔记——单向链表(C++)_C++_14

题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构 。

刷题笔记——单向链表(C++)_C++_15

解题思路

双指针。首先我们要明确,当两指针相遇时,即为两个链表的交点。那么,何时相遇?同时迭代两链表,1° 当两链表前段长度相同时,显然会相遇。 2° 当两链表前端长度不等时,示意图如下:

刷题笔记——单向链表(C++)_C++_16

等式表明:当两指针遍历完原链表后,再从另一链表表头开始迭代,会相遇。

代码实现

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        if(!headA || !headB){
            return nullptr;
        }
        ListNode *pa = headA, *pb = headB;
        while(pa != pb){
            pa = pa == nullptr ? headB:pa->next;
            pb = pb == nullptr ? headA:pb->next;
        }
        return pa;
    }
};

标签:head,ListNode,cur,C++,next,链表,节点,刷题
From: https://blog.51cto.com/goku0623/9127278

相关文章

  • 循环单链表实现
    #include<stdio.h>#include<stdlib.h>#defineElemtypeint#defineERROR-1/*循环链表实现*/typedefstructNode{Elemtypee;Node*next;}Node,*LinkList;voidInitList(LinkList&pHead){pHead=(Node*)malloc(sizeof(Node)......
  • c++ 期末编程题
    当然,我可以帮你整理一下你提供的C++代码,并为每个代码片段添加相应的标题。请看下面的整理:1.计算两点之间的距离#include<iostream>#include<cmath>usingnamespacestd;intmain(){intx1,x2,y1,y2;cout<<"请输入x1,x2,y1,y2的值";cin>>x1>>x2>>......
  • 链表-adlist
    2.链表相关文件adlist.hadlist.c1.定义typedefstructlistNode{structlistNode*prev;structlistNode*next;void*value;}listNode;typedefstructlistIter{listNode*next;intdirection;}listIter;typedefstructlist{l......
  • 数据结构【线性表之单链表】
    链表链表:线性表还可以使用链式存储方式保存,即线性表中的各个元素保存在各自的存储空间中,形成一个个节点。这些结点在内存的地址不要求是相邻的,它们之间通过指针连接起来。特点:灵活存储,不要求预先分配一块连续的空间,而是按需分配,随时需要,随时分配不要求分配的空间必须是相邻的没有......
  • C++ Module详解,模块化编程终极指南
    C++Module详解,模块化编程终极指南模块接口文件定义和扩展名模块接口文件定义了模块所提供功能的接口。这些文件通常具有.cppm扩展名。模块接口以声明文件定义了某个名称的模块开始,这被称为模块声明。模块的名称可以是任何有效的C++标识符。名称可以包含点,但不能以点开头或结......
  • C++函数模板详解,轻松实现通用函数
    C++函数模板详解,轻松实现通用函数函数模板编写通用函数您也可以为独立的函数编写模板。其语法与类模板类似。例如,您可以编写以下通用函数来在数组中查找一个值并返回其索引:staticconstsize_tNOT_FOUND{static_cast<size_t>(-1)};template<typenameT>size_tFind(const......
  • 刷题笔记——顺序表(C++)
    665.非递减数列-力扣(LeetCode)给你一个长度为 n 的整数数组 nums ,请你判断在 最多 改变 1 个元素的情况下,该数组能否变成一个非递减数列。我们是这样定义一个非递减数列的: 对于数组中任意的 i (0<=i<=n-2),总满足 nums[i]<=nums[i+1]。解题思路遍历数组,计算递......
  • C++汇总路径下全部文件名并提取出指定类型或名称的文件
      本文介绍基于C++语言,遍历文件夹中的全部文件,并从中获取指定类型的文件的方法。  首先,我们来明确一下本文所需实现的需求。现在有一个文件夹,其中包含了很多文件,如下图所示;我们如果想获取其中所有类型为.bmp格式的文件的名称,如果文件数量比较多的话,手动筛选就会很麻烦。而借......
  • C++11中的匿名函数用法
    C++11中引用了匿名函数这一个新的特性,它的使用方法如下:[capture](parameters)->return_type{body} 其中:capture 指定了Lambda表达式可以访问的外部变量parameters 是Lambda表达式的参数列表return_type 是返回类型(可选)body 是Lambda函数体下面是一个简单......
  • 【C++】STL 容器 - set 集合容器 ⑥ ( pair 对组简介 | pair 对组元素访问 | set 集合
    文章目录一、pair对组1、pair对组简介2、pair对组元素访问3、代码示例-pair对组4、set集合容器存储pair对组元素二、set集合容器insert插入结果类型-pair对组1、std::set#insert函数原型分析2、代码示例-std::set#insert函数插入元素结果分析一、pair对组1......