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

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

时间:2024-07-06 22:31:22浏览次数:26  
标签:ListNode int 随想录 fast next 链表 temA NULL 节点

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

题目:. - 力扣(LeetCode)

思路:这题关键是要每次进行两个结点的操作,并且每次都要保存其前结点,做题思路比较清晰,但是总是处理不好边界问题,总是越界。

代码:

/**
 * 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* virhead=new ListNode(0,head);
    ListNode* pre=virhead;
    ListNode* cur=head;
    while(cur!=NULL&&cur->next!=NULL){
        pre->next=cur->next;
        cur->next=cur->next->next;
        pre->next->next=cur;
        pre=cur;
        cur=cur->next;
    }
    return virhead->next;
    }
};

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

题目:. - 力扣(LeetCode)

思路:最开始想到的是最简单的两次遍历,之后看卡哥的文章学会了快慢双指针一次遍历完成。

代码:

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* dummyHead = new ListNode(0);
        dummyHead->next = head;
        ListNode* slow = dummyHead;
        ListNode* fast = dummyHead;
        while(n-- && fast != NULL) {
            fast = fast->next;
        }
        fast = fast->next;
        while (fast != NULL) {
            fast = fast->next;
            slow = slow->next;
        }
        slow->next = slow->next->next; 
        
        return dummyHead->next;
    }
};

面试题 02.07. 链表相交 

题目:. - 力扣(LeetCode)

思路:看提示做的,关键是通过遍历来得到长度差。

代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode* temA=headA;
        ListNode* temB=headB;
        int a=1,b=1;
        if(headA==NULL||headB==NULL)
        return NULL;
        while(temA->next!=NULL)
        {
            temA=temA->next;
            a++;
        }
        
        while(temB->next!=NULL)
        {
            temB=temB->next;
            b++;
        }
        if(temA!=temB)
        return NULL;
        temA=headA;
        temB=headB;
        if(b>a){
            swap(a,b);
            swap(temA,temB);
        }
        int gap=a-b;
        for(int i=0;i<gap;i++){
            temA=temA->next;
        }
        while(temA!=temB){
            temA=temA->next;
            temB=temB->next;
        }
        return temA;
    }
};

142.环形链表II 

题目:. - 力扣(LeetCode)

思路:服力,这不是纯纯数学题吗?应该是追击问题吧,用快慢指针解决。

代码:

/**
 * 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&&fast->next)
        {
            fast=fast->next->next;
            slow=slow->next;
            if(fast==slow)
            {
             ListNode* index1=fast;
             ListNode* index2=head;
             while(index1!=index2)
             {
                index1=index1->next;
                index2=index2->next;
             }
             return index1;
            }
        }
        return NULL;
    }
};

总结:这次算法题整体不算太难,就是数学题不太会

标签:ListNode,int,随想录,fast,next,链表,temA,NULL,节点
From: https://blog.csdn.net/dtgfhfd/article/details/140236006

相关文章

  • 代码随想录算法训练营第三天 | 203.移除链表元素 、 707.设计链表 、206.反转链表
    203.移除链表元素题目:.-力扣(LeetCode)思路:主要是通过运用虚拟头节点来统一移除元素的写法。代码:/***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode():val(0),next(nullptr){}*ListNode......
  • 代码随想录刷题day 4 | 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题
    24.两两交换链表中的节点迭代的版本:最重要的就是要知道循环变量怎么取,对于这道题,我们只需要存储需要交换的两个节点的前一个节点即可,只有当这个节点后面有两个节点时才进入循环,其实把握住这一点之后这题就非常容易了。递归的版本:这道题用递归做简直不要太简单,首先明白递归结束......
  • ComfyUI进阶篇:ComfyUI核心节点(二)
    ComfyUI核心节点(二)前言:学习ComfyUI是一场持久战。当你掌握了ComfyUI的安装和运行之后,会发现大量五花八门的节点。面对各种各样的工作流和复杂的节点种类,可能会让人感到不知所措。在这篇文章中,我们将用通俗易懂的语言对ComfyUI的核心节点进行系统梳理,并详细解释每个参数。希望......
  • el-tree懒加载获取所有已经选的节点
    用于el-tree懒加载一个图层目录,勾选父级目录,需要得到该父级目录下所有叶子节点数据<el-tree:data="directoryDataLayer"show-checkboxnode-key="id":load="directoryDataLoad"......
  • 数据结构——(双)链表
    文章目录1. 定义2. 双链表和单链表的区别3.代码示例3.1双链表节点和结构定义3.2初始化双链表3.3 返回双链表的长度3.4 在指定位置插入元素3.5 在末尾插入元素3.6 删除指定位置的元素并返回被删除的元素3.7 删除末尾元素3.8获取指定位置的元素3.9修改指......
  • 数据结构——单向循环链表
    文章目录1.概念2. 区别2.1结构区别2.2访问方式区别2.3优缺点对比3.流程4. 基本操作5.代码示例1.概念单向循环链表是一种特殊的单链表,其中最后一个节点的后继指针指向头节点,形成一个环。单向循环链表适合用于需要循环访问数据的场景,如约瑟夫环问题。节点......
  • 代码随想录算法训练营第五十六天 | 98.所有可达路径
    98.所有可达路径题目链接文章讲解邻接矩阵法邻接矩阵使用二维数组来表示图结构。邻接矩阵是从节点的角度来表示图,有多少节点就申请多大的二维数组为了节点标号和下标对其,有n个节点的图申请(n+1)*(n+1)的空间vector<vector<int>>graph(n+1,vector<int>(n+1,0)......
  • 代码随想录算法训练营第二天 | 203.移除链表元素 707.设计链表 206.反转链表
    代码随想录算法训练营第二天|203.移除链表元素707.设计链表206.反转链表进入链表章节,就要和虚拟头结点(dummyhead)打交道了,还要注意边界条件和空指针异常移除链表元素题目链接/文章讲解/视频讲解::https://programmercarl.com/0203.%E7%A7%BB%E9%99%A4%E9%93%BE%E8%A1%A......
  • CDN节点是什么
    CDN节点是什么CDN主要依靠部署在各地的边缘服务器,利用全局负载技术将用户的访问指向距离最近且正常工作的缓存服务器上,用户访问网站时由缓存服务器直接响应用户请求。CDN节点作为用来缓存数据的服务器,会将用户请求自动指向距离最近的CDN节点。随着CDN服务商在全球各地部......
  • 「代码随想录算法训练营」第四天 | 链表 part2
    24.两两交换链表中的节点题目链接:https://leetcode.cn/problems/swap-nodes-in-pairs/题目难度:中等文章讲解:https://programmercarl.com/0024.两两交换链表中的节点.html#算法公开课视频讲解:https://www.bilibili.com/video/BV1YT411g7br题目状态:有思路,但细节缺乏考虑个......