首页 > 其他分享 >代码随想录刷题day 4 | 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II 总结

代码随想录刷题day 4 | 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II 总结

时间:2024-07-06 22:20:04浏览次数:18  
标签:head ListNode 随想录 fast next 链表 节点

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

迭代的版本:最重要的就是要知道循环变量怎么取,对于这道题,我们只需要存储需要交换的两个节点的前一个节点即可,只有当这个节点后面有两个节点时才进入循环,其实把握住这一点之后这题就非常容易了。

递归的版本:这道题用递归做简直不要太简单,首先明白递归结束的条件,显然当链表为空或者链表只有一个节点的时候,不需要操作即可。假如列表中有n + 2个节点,其中后n个已经按照要求交换好了,交换好的链表的头用tmp存储。此时,我们只需要把前两个节点交换后并和后面的链表连接起来即可。

上代码

class Solution { // 迭代
    public ListNode swapPairs(ListNode head) {
        if(head == null || head.next == null) return head;
        ListNode dummyHead = new ListNode(0, head);
        ListNode pre = dummyHead; 

        while(pre.next != null && pre.next.next != null){ //循环内部就是交换两节点的操作,这个顺序需要注意一下
            ListNode n1 = pre.next, n2 = n1.next;
            n1.next = n2.next;
            n2.next = n1;
            pre.next = n2;
            pre = n1;
        }
        return dummyHead.next;
    }
}

class Solution {  //递归
    public ListNode swapPairs(ListNode head) {
        if(head == null || head.next == null) return head;
        ListNode tmp = swapPairs(head.next.next);
        ListNode n2 = head.next, n1 = head;
        n1.next = tmp;
        n2.next = n1;
        return n2;
    }
}

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

链表这些题,为了记忆方便还是都采用dummyHead的做法吧,不是说不能不用,要用就全都用,别搞混了。就和前面数组二分法一样,就左闭右闭,别想别的。要删除一个节点,关键是找到要删除节点的前一个节点,我们可以想到,倒数第n个节点的前一个节点距离倒数第一个节点距离为n。因此,快指针先走n步,随后两个指针一起走,当快指针到达最后一个节点时,慢指针指向的就是倒数第n个节点的前一个节点,此时执行删除操作即可。

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummyHead = new ListNode(0, head);
        ListNode fast = dummyHead, slow = dummyHead;
        for(int i = 0; i < n; i++){
            fast = fast.next;
        }
        while(fast.next != null){
            fast = fast.next;
            slow = slow.next;
        }
        slow.next = slow.next.next;
        return dummyHead.next;
    }
}

面试题 02.07. 链表相交

双指针法每次看思路都能看明白,但每次都写不出题解这么清晰简单的流程。实在不行就用HashMap,简单易懂不出错。

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if(headA == null || headB == null) return null;
        ListNode t1 = headA, t2 = headB;
        while(t1 != t2){
            System.out.println(t1);
            System.out.println(t2);
            t1 = t1 == null ? headB : t1.next;
            t2 = t2 == null ? headA : t2.next;
            
        }
        return t1;
    }
}

142. 环形链表 II

这不纯纯证明题啊,这要是我没见过这个写法,打死也想不到。贴个题解

说说我的理解吧:这道题的关键就在于理解快慢指针的相遇点距离环入口的距离和从头节点到入口的距离相等。好了,去证明吧(不是)。假设相遇时slow走了a+b步,其中a是从头节点走到入口处的步数,也就是环外节点数目。此时fast走了2 * (a+b),同时2 * (a+b) == a + nc + b,c是环内节点数。由此可得a+b == nc。所以从相遇点走a步就可以到达环入口(因为走a + nc(a步到入口,nc就是套圈)步就可以到达入口处)。我们不知道a是多少,但此时从头节点再出发一个指针一起走,肯定就会在入口处相遇。

public class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode slow = head, fast = head;
        while(true){
            if(fast == null || fast.next == null) return null;
            fast = fast.next.next;
            slow = slow.next;
            if(fast == slow) break;
        }
        fast = head;
        while(fast != slow){
            slow = slow.next;
            fast = fast.next;
        }
        return fast;
    }
}

每天都做点,慢慢也就进步了。不过还是有点畏难情绪,做着做着就偷懒了,慢慢改善吧。

标签:head,ListNode,随想录,fast,next,链表,节点
From: https://www.cnblogs.com/12sleep/p/18288011

相关文章

  • 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题目状态:有思路,但细节缺乏考虑个......
  • 电力系统——基于10机39节点的电力系统仿真(Matlab)
      目录1引言2 案例仿真 2.1负荷参数 2.2线路、变压器参数2.3发电机参数2.4励磁参数 310机39节点的仿真 3.1建立Simulink模型3.2 MATLAB程序实现 3.3运行结果 3.4结果分析4总结 5资源下载1引言   目前,随着科学技术的发展和电能......
  • 代码随想录算法训练营第3天 | 链表删除元素
    删除链表元素,技巧是设置一个虚拟头节点,这样就可以把原始头节点当做普通节点处理了,最后再返回虚拟头结点的next即可。题203.移除链表元素/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*......