首页 > 编程语言 >代码随想录算法训练营第四天 | 23.两l两交换链表中的节点 19.删除链表的倒数第N个节点 链表相交 142.环形链表II

代码随想录算法训练营第四天 | 23.两l两交换链表中的节点 19.删除链表的倒数第N个节点 链表相交 142.环形链表II

时间:2024-05-12 14:42:18浏览次数:15  
标签:current slow ListNode 随想录 fast next 链表 节点

23.两两交换链表中的两个节点

题目链接 文章讲解 视频讲解

  • 时间复杂度 o(n)
  • 空间复杂度 o(1)

tips: 画图,并将每一步操作用伪代码写出来,然后将代码理顺可以避免修改代码的麻烦
初始化的时候就要将previous初始化为current的前一个节点,这样可以保证循环的第一步满足循环要求

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        // 定义虚拟头节点
        ListNode * dummy = new ListNode();
        dummy->next = head;
        // 初始化current指向第一个节点也就是头节点,previous指向current的前一个节点
        ListNode * current = head, * previous = dummy;
        // 如果current不为空执行循环
        while(current) {
            // 定义一个节点保存带交换的两个节点的前一个节点
            ListNode * temp = previous;
            // previous指向带交换的两个节点中第一个节点
            previous = current;
            // 如果current的下一个节点不为空,那么current指向待交换的两个节点中第二个节点
            if(current->next) {
                current = current -> next;
                // 交换两个节点
                previous->next = current->next;
                current->next = previous;
                temp->next = current;
            } else {
                // 如果current的下一个节点为空那么只有一个待交换节点,此时返回
                return dummy->next;
            }
            // current指向下一组待交换的两个节点中的第一个节点
            current = previous->next;
        }
        return dummy->next;
    }
};

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

题目链接 文章讲解 视频讲解

  • 时间复杂度 o(n)
  • 空间复杂度 o(1)

tips: 这里再删除的时候不需要判断slow是否为空因为最开始的时候slow指向dummy,slow->next指向head,两者都不为空,在有fast作为先导的情况下,slow不可能为空,slow的next也不可能为空

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode * dummy = new ListNode;
        dummy->next = head;
        ListNode * fast = dummy;
        ListNode * slow = dummy;
        while(n-- && fast) fast = fast->next;
        while(fast->next) {       
            // 慢指针出发
            fast = fast->next;
            slow = slow->next;
        }

        ListNode *temp = slow->next;
        slow->next = slow->next->next;
        delete temp;
        
        return dummy->next;
    }
};

面试题02.07链表相交

题目链接 文章链接

  • 时间复杂度 o(n)
  • 空间复杂度 o(1)
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode * curr_a = headA, * curr_b = headB;

        while(curr_a != curr_b) {
            if(curr_a) {
                curr_a = curr_a->next;
            } else {
                curr_a = headB;
            }
            if(curr_b) {
                curr_b = curr_b->next;
            } else {
                curr_b = headA;
            }
        }
        return curr_a;
    }
};

142.环形链表II

题目链接 文章讲解 视频讲解

  • 时间复杂度 o(n)
  • 空间复杂度 o(1)
class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode * fast = head, *slow = head;
        if(!head) return nullptr;
        while(fast->next) {
            fast = fast->next;
            if(fast->next) fast = fast->next;
            else return nullptr;
            slow = slow->next;
            if(slow == fast) break;
        }
        if(!fast->next) return nullptr;
        ListNode * current = head;
        while(current != fast) {
            current = current->next;
            fast = fast->next;
        }
        return fast;
    }
};

标签:current,slow,ListNode,随想录,fast,next,链表,节点
From: https://www.cnblogs.com/cscpp/p/18187339

相关文章

  • 代码随想录算法训练营第第二天 | 24. 两两交换链表中的节点 、19.删除链表的倒数第N
    两两交换链表中的节点用虚拟头结点,这样会方便很多。本题链表操作就比较复杂了,建议大家先看视频,视频里我讲解了注意事项,为什么需要temp保存临时节点。题目链接/文章讲解/视频讲解:https://programmercarl.com/0024.两两交换链表中的节点.html/***Definitionforsingly-li......
  • 稀疏矩阵 - 十字链表 & 快速转置
    十字链表每个稀疏矩阵非零元素都是一个结点,数据域存储的是所在行、所在列和元素值,有两个指针域,分别存储的是指向与该元素同行的下一个非零元素和同列的下一个非零元素的指针。所以一个m行n列的稀疏矩阵,(最多)总共有(m+n)个链表,即(在每行每列都有非零元素的情况下,当然这样可能并不算......
  • 代码随想录训练营第三天 | 203.移处链表元素 707.设计链表 206.反转链表
    203.移除链表元素题目链接https://leetcode.cn/problems/remove-linked-list-elements/文章讲解https://programmercarl.com/0203.移除链表元素.html#算法公开课视频讲解https://www.bilibili.com/video/BV18B4y1s7R9/?vd_source=2b5b33d3d692b0064daff4e58957fc82tips:对......
  • 450. 删除二叉搜索树中的节点(leetcode)
    https://leetcode.cn/problems/delete-node-in-a-bst/要点是确定函数语义,单层递归逻辑,确定好有返回值的这种写法,分析出5种情况,递归的时候接收好递归的返回的新树的根节点即可classSolution{//函数语义(单层递归逻辑):查找要删除的节点,并且返回删除节点后新的树的......
  • 阿里2面:你们部署多少节点?1000W并发,当如何部署?
    阿里2面:你们部署多少节点?1000W并发,当如何部署? 文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技......
  • 手撕链表(自存)
    #include<stdio.h>#include<stdlib.h>typedefintE;typedefstructnode{Eval;structnode*next;}ListNode;ListNode*list_creat(){ListNode*list=malloc(sizeof(ListNode));returnlist;}voidpush_back(ListNode*List......
  • 代码随想录训练营第二天 | 977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵II
    977.有序数组的平方题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/文章讲解:https://programmercarl.com/0977.有序数组的平方.html视频讲解:https://www.bilibili.com/video/BV1QB4y1D7ep暴力解时间复杂度O(nlogn)空间复杂度O(1)双指针法时间复......
  • ROS服务通讯创建服务节点(service)与客户端节点(client)
    学习参考:ROS/Tutorials/WritingServiceClient(python)-ROSWiki  首先需要一个工作空间,进入工作空间下的src文件夹下再创建一个功能包,进入功能包后创建scripts放置.py源码文件  服务节点源码创建格式:老样子还是剖析源码 首先导入包这里的_future_包中的print_func......
  • k8s中如何控制pod运行的节点
    在Kubernetes(K8s)中,可以通过几种方式来控制Pod运行的节点。以下是一些常用的方法:使用nodeName:在Pod的YAML定义中,你可以使用nodeName字段来指定Pod应该运行在哪个节点上。nodeName字段的值应该是目标节点的名称。如果节点不存在或者不可调度,Pod将不会被创建。使用nodeSele......
  • 代码随想录算法训练营第第二天 | 977.有序数组的平方 、27. 移除元素
    977.有序数组的平方题目建议:本题关键在于理解双指针思想题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/文章讲解:https://programmercarl.com/0977.有序数组的平方.html视频讲解:https://www.bilibili.com/video/BV1QB4y1D7ep/***@param{number[]}nu......