day04 142.环形链表II 面试题 02.07. 链表相交19.删除链表的倒数第N个节点24. 两两交换链表中的节点

news/2025/1/18 1:28:50/文章来源:https://www.cnblogs.com/lin0304/p/18677898
  1. 环形链表 II(142. Linked List Cycle II)
    问题描述:给定一个链表,返回链表开始入环的第一个节点。如果链表无环,则返回null。
    解决方案:
    //142.环形链表II
    public ListNode detectCycle(ListNode head) {
    ///耗时较长
    Set set = new HashSet<>();
    ListNode cur = head;
    while (cur != null) {
    if (set.contains(cur)) {
    return cur;
    }
    set.add(cur);
    cur = cur.next;
    }
    return null;
    /
    ListNode slow = head;
    ListNode fast = head;
    boolean isCycle = false;
    while (fast != null && fast.next != null) {
    slow = slow.next;
    fast = fast.next.next;
    if (slow == fast) {
    isCycle=true;
    break;
    }
    }
    //从头结点出发一个指针,从相遇节点 也出发一个指针,这两个指针每次只走一个节点,
    // 那么当这两个指针相遇的时候就是 环形入口的节点。
    if (isCycle) {
    slow = head;
    while (fast != slow) {
    fast = fast.next;
    slow = slow.next;
    }
    return slow;
    }
    return null;
    }
    解释:
    使用快慢指针法检测环的存在。
    如果检测到环,将一个指针重置为链表的头节点,然后两个指针同时向前移动,每次移动一步,当两个指针再次相遇时,该点即为环的入口。

  2. 面试题 02.07. 链表相交
    问题描述:给定两个单链表,判断它们是否相交,如果相交,返回相交的起始节点。
    解决方案:
    //面试题 02.07. 链表相交
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
    if (headA == null || headB == null) {
    return null;
    }
    ListNode a=headA,b=headB;
    int aLen=0,bLen=0;
    while (a != null) {
    aLen++;
    a=a.next;
    }
    while (b != null) {
    bLen++;
    b=b.next;
    }
    a=headA;
    b=headB;
    int diff=Math.abs(aLen-bLen);
    if(aLen>bLen){
    //int diff=aLen-bLen;
    for(int i=0;i<diff;i++){
    a=a.next;
    }
    while(a!=null){
    if(ab){
    return a;
    }
    a=a.next;
    b=b.next;
    }
    }else {
    //int diff=bLen-aLen;
    for(int i=0;i<diff;i++){
    b=b.next;
    }
    while(b!=null){
    if(b
    a){
    return b;
    }
    b=b.next;
    a=a.next;
    }
    }
    return null;
    }
    /(版本二) 合并链表实现同步移动
    public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
    // p1 指向 A 链表头结点,p2 指向 B 链表头结点
    ListNode p1 = headA, p2 = headB;
    while (p1 != p2) {
    // p1 走一步,如果走到 A 链表末尾,转到 B 链表
    if (p1 == null) p1 = headB;
    else p1 = p1.next;
    // p2 走一步,如果走到 B 链表末尾,转到 A 链表
    if (p2 == null) p2 = headA;
    else p2 = p2.next;
    }
    return p1;
    }
    }
    /
    解释:
    计算两个链表的长度。
    将较长的链表的指针移动到与较短链表相同长度的位置。
    同时移动两个指针,如果相遇则返回该节点,否则返回null。

  3. 删除链表的倒数第N个节点(19. Remove Nth Node From End of List)
    问题描述:给定一个链表,删除链表的倒数第n个节点,并返回新的链表头节点。
    解决方案:
    // 19.删除链表的倒数第N个节点
    public ListNode removeNthFromEnd(ListNode head, int n) {
    int size = 0;
    ListNode dummy = new ListNode(Integer.MIN_VALUE,head);
    ListNode cur = dummy.next;
    while (cur!= null) {
    size++;
    cur = cur.next;
    }
    if (size == n) {
    return head.next;
    }
    cur=dummy;
    for (int i = 0; i < size - n; i++) {
    if (cur != null) {
    cur = cur.next;
    }
    }
    if (cur!=null&&cur.next != null) {
    cur.next=cur.next.next;
    }
    return dummy.next;
    }
    解释:
    使用一个哨兵节点dummy,其next指针指向链表的头节点。
    计算链表的长度size。
    如果要删除的节点是头节点,直接返回head.next。
    否则,找到倒数第n+1个节点,将其next指针指向倒数第n-1个节点,从而删除倒数第n个节点。

  4. 两两交换链表中的节点(24. Swap Nodes in Pairs)
    问题描述:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
    解决方案:
    //24. 两两交换链表中的节点
    public ListNode swapPairs(ListNode head) {
    if (head == null || head.next == null) {
    return head;
    }
    ListNode cur1=head;
    ListNode cur2=head.next;
    ListNode res=cur2;
    ListNode temp;
    while (true){
    temp=cur2.next;
    cur1.next=temp;
    cur2.next=cur1;
    if(tempnull){
    break;
    } else if (temp.next
    null) {
    break;
    }else {
    cur1.next=temp.next;
    }
    cur1=temp;
    cur2=temp.next;
    }
    return res;
    }
    解释:
    如果链表为空或只有一个节点,直接返回原链表。
    使用两个指针cur1和cur2分别指向当前节点和下一个节点。
    交换两个节点,并更新指针。
    重复上述步骤,直到链表结束。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/871049.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

去攀登更高的山,渡过更长的河--软件工程个人总结

轻舟已过万重山——2024秋软工实践个人总结博客一、学期回顾 1.1 回顾你对于软件工程课程的想象 初次接触软件工程这门课程时,我内心充满了忐忑与不安 😰。作为一门实践性极强的课程,它不仅要求我们掌握各种开发技术,还需要我们具备团队协作、项目管理等综合能力。我记得第…

Avalonia系列文章之小试牛刀

最近有朋友反馈,能否分享一下Avalonia相关的文章,于是就抽空学习了一下,发现Avalonia真的是一款非常不错的UI框架,值得花时间认真学习一下,于是边学习边记录,整理成文,分享给大家,希望可以一起学习,共同进步。最近有朋友反馈,能否分享一下Avalonia相关的文章,于是就…

器件选型基础知识

器件选型基础知识器件选型基础知识 1. PCB结构与工艺 PCB主要由五部分组成,分别是介电层、孔、防焊墨油、丝印和线路组成。介电层:用来保持线路及各层之间的绝缘性,俗称为基材,最常见的材料是玻璃纤维; 孔:导通孔可以使两层次以上的线路彼此导通; 防焊墨油:对于整个电路…

【CodeForces训练记录】Codeforces Round 997 (Div. 2)

训练情况赛后反思 A题犯蠢了,题目看成面积了,C题应该可以更快的搓出来,只能说结论猜了几次不对 A题 我们把周长移动一下,补成一个长方形,左下角的坐标为 \((x_1,y_1)\),右上角坐标为 \((\sum{x_i}+m,\sum{y_i}+m)\),已知两点直接求周长 #include <bits/stdc++.h> …

引用 EAGLE/EAGLE2 的文章汇总

引用 EAGLE/EAGLE2 的文章汇总这张图是 eagle 和 previous approaches 的加速效果对比。 引用 eagle 的文章也可以被分成很多类,它们引用 eagle/eagle2 的侧重点也很多样。有不少文章是把 eagle 和 eagle2 作为 speculative decoding 的示例,这种不再在这里列出了。有些文章我…

【Kali工具】一款聚合暴力破解工具 Kraken

本文为大家分析一款聚合密码破解工具。集成了常见的破解类型,上手也比较简单,一起来看看吧。 在Kali中安装在Kali或者在其他Linux系统中,我们执行下面命令进行安装。 git clone https://github.com/jasonxtn/kraken.git cd Kraken pip install -r requirements.txt #运行 py…

G1原理—10.如何优化G1中的FGC

大纲 1.G1的FGC可以优化的点 2.一个bug导致的FGC(Kafka发送重试 + subList导致List越来越大) 3.为什么G1的FGC比ParNew + CMS要更严重 4.FGC的一些参数及优化思路1.G1的FGC可以优化的点 (1)FGC的基本原理 (2)遇到FGC应该怎么处理 (3)应该如何操作来规避FGC (4)应该如何操作来加…

firefox浏览器deepin20.9下缩放异常

地址栏输入about:config,修改layout.css.devPixelsPerPx默认1.25,改为1.0就可以了。 deepin版本: 20.9 社区版 firefox版本: 115.18.0esr (64 位) 修改前改参数修改后

【内网攻防】WMI的利用

# 红队 # 红蓝对抗 # 内网攻防 WMI简介 WMI,全称Windows Management Instrumentation,是微软开发的一种用于管理Windows系统的工具。你可以把它想象成一个数据库工具,它存储了关于你的电脑的各种信息,比如系统、应用程序、网络和设备等。 WMI使用了一种特殊的方式来表示这…

【后门】cymothoa后门的利用

# 后门工具 # 红队 cymothoa简介: Cymothoa是一款隐秘的后门工具,通过向目标主机上活跃的进程注入恶意代码来执行后门工作,这也反向说明了,实际上Cymothoa后门会拥有和原进程相同的权限,且Cymothoa是通过向系统进程注入shellcode去执行后门,所以不会像以前写过的许多后门…

Linux 符号链接

Linux中的符号链接是一种特殊类型的文件,允许用户创建指向其他文件或目录的链接,便于访问和管理文件系统。创建和删除符号链接很简单,使用ln -s命令可以创建链接,而unlink和rm命令可用于删除它。用户还可以通过命令查找和处理失效的符号链接,以维护文件系统的整洁。在Linu…

在 Linux 中查看符号链接指向

在 Linux 系统中,可以通过使用 readlink、realpath 和 ls -la 命令来查看符号链接指向的目标文件或目录,选择不同命令可以满足不同的路径解析需求。在 Linux 系统中,符号链接(symbolic link)是一种特殊类型的文件,它指向另一个文件或目录。为了查看符号链接指向的目标文件…