leetCode- - - 链表

news2024/11/17 15:37:46

目录

1.反转链表(leetcode206)

​编辑

2. 链表内指定区间反转(leetcode92)

3.链表中的节点每k个一组翻转(leetcode25)

4.合并两个排序的链表(leetcode21)

5.链表的中间节点(leetcode876)

6.重排链表(leetcode143)

7.旋转链表(leetcode61)

8.删除排序链表中的重复元素(leetcode83)

9.删除排序链表中的重复元素(LeetCode 82)(迭代版)

10.环形链表 II ( LeetCode 142 )

11.回文链表( LeetCode 234 )

12.相交链表( LeetCode 160 )

13.奇偶链表( LeetCode 328 )

14.移除链表元素( LeetCode 203 )

15.链表题目做题总结


1.反转链表(leetcode206)

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @return ListNode类
     */
    public ListNode ReverseList (ListNode head) {
        // write code here
        ListNode prev=null;
        ListNode cur=head;
        if(head==null){
            return null;
        }
        if(head.next==null){
            return head;
        }
        while(cur!=null){
            ListNode temp=cur.next;
            cur.next=prev;
            prev=cur;
            cur=temp;
        }
        return prev;
    }
}

2. 链表内指定区间反转(leetcode92)

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @param m int整型 
     * @param n int整型 
     * @return ListNode类
     */
    public ListNode reverseBetween (ListNode head, int m, int n) {
        // write code here
        ListNode dummy=new ListNode(0);
        dummy.next=head;
        ListNode prev=dummy;
        for(int i=0;i<m-1;i++){
            prev=prev.next;
        }
        ListNode cur=prev.next;
        for(int i=0;i<n-m;i++){
            ListNode temp=cur.next;
            cur.next=temp.next;
            temp.next=prev.next;
            prev.next=temp;
        }
        return dummy.next;
    }
}

3.链表中的节点每k个一组翻转(leetcode25)

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param head ListNode类
     * @param k int整型
     * @return ListNode类
     */
    public ListNode reverseKeyGroup (ListNode head, int k) {
        // write code here
       ListNode tail=head;
       //1.递归结束的点
        for (int i = 0; i < k; i++) {
            if(tail==null){
                return head;
            }
            tail=tail.next;
        }
        //2.完成每k个元素内的翻转
        ListNode prev=null;
        ListNode cur=head;
        while (cur!=tail){
            ListNode temp=cur.next;
            cur.next=prev;
            prev=cur;
            cur=temp;
        }
        head.next=reverseKeyGroup(tail,k);
        return prev;
    }
}

4.合并两个排序的链表(leetcode21)

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param pHead1 ListNode类 
     * @param pHead2 ListNode类 
     * @return ListNode类
     */
    public ListNode Merge (ListNode pHead1, ListNode pHead2) {
        // write code here
        ListNode dummy =new ListNode(-1);
        ListNode prev=dummy;
        while(pHead1!=null && pHead2!=null){
            if(pHead1.val<pHead2.val){
                prev.next=pHead1;
                pHead1=pHead1.next;
                 prev=prev.next;
            }else{
                prev.next=pHead2;
                pHead2=pHead2.next;
                 prev=prev.next;
            }
        }
        if(pHead1!=null){
            prev.next=pHead1;
        }
        if(pHead2!=null){
            prev.next=pHead2;
        }
        return dummy.next;
    }
}

5.链表的中间节点(leetcode876)

解题:快慢指针

class Solution {
    public ListNode middleNode(ListNode head) {
        ListNode fast=head;
        ListNode slow=head;
        while(fast!=null && fast.next!=null){
            slow=slow.next;
            fast=fast.next.next;
        }
        return slow;
    }
}

6.重排链表(leetcode143)

给定一个单链表 L 的头节点 head ,单链表 L 表示为:

L0 → L1 → … → Ln - 1 → Ln

请将其重新排列后变为:

L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …

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

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public void reorderList(ListNode head) {
        //1.快慢指针找到中间节点,分成左右两个链表
        ListNode leftHead=head;
        ListNode mid=midNode(head);
        ListNode rightHead=mid.next;
        //断开左右两个链表
        mid.next=null;
        //2.反转右边的链表
       rightHead=reverse(rightHead);
        //3.交错合并左右链表
        while(leftHead!=null && rightHead!=null){
            ListNode leftHeadNext=leftHead.next;
            ListNode rightHeadNext=rightHead.next;
            leftHead.next=rightHead;
            leftHead=leftHeadNext;
            rightHead.next=leftHead;
            rightHead=rightHeadNext;
        }
    }
    public ListNode midNode(ListNode head){
        ListNode slow=head;
        ListNode fast=head;
        while(fast!=null && fast.next!=null){
            fast=fast.next.next;
            slow=slow.next;
        }
        return slow;
    }

    public ListNode reverse(ListNode head){
        ListNode prev=null;
        ListNode cur=head;
        if(head==null){
            return null;
        }
        if(head.next==null){
            return head;
        }
        while(cur!=null){
            ListNode temp=cur.next;
            cur.next=prev;
            prev=cur;
            cur=temp;
        }
        return prev;
    }
}

7.旋转链表(leetcode61)

给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode rotateRight(ListNode head, int k) {
        if(head==null || k==0){
            return head;
        }
        //计算出链表的长度,当k非常大时,走k步等于走k%len步
        ListNode cur=head;
        int len=0;
        while(cur!=null){
            len+=1;
            cur=cur.next;
        }
        k=k%len;

        //former指针先走k步
        ListNode former=head;
        ListNode later=head;
        for(int i=0;i<k;i++){
            former=former.next;
        }
        while(former.next!=null){
            former=former.next;
            later=later.next;
        }
        former.next=head;
        ListNode newHead=later.next;
        later.next=null;
         return newHead;
    }
}

8.删除排序链表中的重复元素(leetcode83)

给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        ListNode cur=head;
        if(head==null || head.next==null){
            return head;
        }
        while(cur!=null && cur.next!=null){
            if(cur.val==cur.next.val){
                cur.next=cur.next.next;
            }else{
                cur=cur.next;
            }
        }
        return head;
    }

9.删除排序链表中的重复元素(LeetCode 82)(迭代版)

给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。

也可以使用递归的方式,个人认为迭代的方式更容易理解。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
         ListNode dummy=new ListNode(-1);
         dummy.next=head;
         ListNode cur=dummy;
         while(cur.next!=null && cur.next.next!=null){
            if(cur.next.val==cur.next.next.val){
                int value=cur.next.val;
                while(cur.next!=null && cur.next.val==value){
                    cur.next=cur.next.next;
                }
            }else{
                cur=cur.next;
            }
         }
         return dummy.next;
    }
}

10.环形链表 II ( LeetCode 142 )

给定一个链表的头节点  head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

不允许修改 链表。

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode fast=head;
        ListNode slow=head;
        while(fast!=null && fast.next!=null){
            fast=fast.next.next;
            slow=slow.next;
        
        if(fast==slow){
            ListNode b=fast;
            ListNode a=head;
            while(a!=b){
                a=a.next;
                b=b.next;
            }
            return a;
        }
     }
        return null;
    }
}

11.回文链表( LeetCode 234 )

给你一个单链表的头节点 head ,请你判断该链表是否为

回文链表

。如果是,返回 true ;否则,返回 false 。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public boolean isPalindrome(ListNode head) {
        if(head.next==null){
            return true;
        }
        if(head.next.next==null){
            if(head.val==head.next.val){
                return true;
            }else{
                return false;
            }
        }
    //1.找到中间节点
    ListNode fast=head;
    ListNode slow=head;
    while(fast.next!=null && fast.next.next!=null){
        fast=fast.next.next;
        slow=slow.next;
    }
    //2.分割为两个链表
    ListNode leftHead=head;
    ListNode rightHead=slow.next;

    //3.反转右边链表
    rightHead= reverse(rightHead);

    //4.比较左右链表
    while (rightHead!=null){
    if(leftHead.val==rightHead.val){
        leftHead=leftHead.next;
        rightHead=rightHead.next;
    }else{
        return false;
    }
   }
   return true;
    }
    public ListNode reverse(ListNode head){
        ListNode pre=null;
        ListNode cur=head;
        while(cur!=null){
            ListNode temp=cur.next;
            cur.next=pre;
            pre=cur;
            cur=temp;
        }
        return pre;
    }
}

12.相交链表( LeetCode 160 )

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

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

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

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

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode pa=headA;
        ListNode pb=headB;
        if(headA==null || headB==null){
            return null;
        }
        while(pa!=pb){
            if(pa==null){
                pa=headB;
            }else{
                pa=pa.next;
            }

            if(pb==null){
                pb=headA;
            }else{
                pb=pb.next;
            }
        }
        return pa;
    }
}

13.奇偶链表( LeetCode 328 )

给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。

第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。

请注意,偶数组和奇数组内部的相对顺序应该与输入时保持一致。

你必须在 O(1) 的额外空间复杂度和 O(n) 的时间复杂度下解决这个问题。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode oddEvenList(ListNode head) {
        //链表为空或者只有一个节点,直接返回即可
        if(head==null || head.next==null){
            return head;
        }
        ListNode odd=head;
        ListNode even=odd.next;
        ListNode evenHead=even;
        while(even!=null && even.next!=null){
            odd.next=even.next;    
            odd=odd.next;
            even.next=odd.next;
            even=even.next;
            }
            odd.next=evenHead;
            return head;
    }
}

14.移除链表元素( LeetCode 203 )

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode removeElements(ListNode head, int val) {
        if(head==null){
            return null;
        }
        ListNode dummy=new ListNode(-1);
        dummy.next=head;
        ListNode pre=dummy;
        ListNode cur=head;
        while(cur!=null){
            if(cur.val==val){
                pre.next=cur.next;
            }else{
                pre=cur;
            }
            cur=cur.next;
        }
        return dummy.next;
    }
}

15.链表题目做题总结


1.画图理清思路:
2.考虑边界条件:链表问题通常有很多边界条件需要考虑,例如空链表、只有一个节点的链表、链表长度为偶数或奇数等等。双指针技巧:
3.快慢指针:用于找链表中点、检测环等问题。
   双指针一前一后:用于逆转链表、找倒数第k个节点等问题。
   双指针同向移动:用于合并两个有序链表等问题。
4.递归的应用:
有些链表问题可以通过递归来简化处理,例如逆转链表、检测回文链表等。
5.注意内存管理:
   如果涉及到链表节点的删除或插入,要确保不会造成内存泄漏或者指针丢失。特别是在删除节点时,要注意处理好被删除节点的前驱和后继节点的指针关系。
6.利用哨兵节点简化操作:
   在一些操作中,使用哨兵节点(dummy node)可以简化边界条件的处理,特别是在涉及头节点操作时特别有效。
 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

揭开 OKR 神秘面纱:打破OKR的概念 –(第1部分)

请注意&#xff0c;《 OKR 解密 》分为5个部分&#xff0c;您目前正在学习其中的一个基本部分&#xff08;5个部分中的第1部分&#xff09;。在这5个要素中&#xff0c;我们将从理论&#xff08;第1部分&#xff09;、应用&#xff08;第2部分&#xff09;、最佳实践&#xff0…

机房托管费用贵吗?机房托管要考虑哪些因素?

机房托管费用受多种因素影响&#xff0c;包括地理位置、设备规模、服务水平、安全性要求等。不同配置和服务质量的托管价格差异较大&#xff0c;一般1U服务器托管费用一年在2000到5000元之间。Rak部落为您整理发布机房托管费用的差异&#xff0c;希望对您选择机房托管时有帮助。…

【GD32 MCU入门教程】四、GD32 MCU 常见外设介绍(3)NVIC 介绍

NVIC(Nested vectored interrupt controller&#xff0c;嵌套向量中断控制器)是Cortex-M处理器的一部分&#xff0c;它是可编程的&#xff0c;且寄存器位于存储器映射的系统控制空间(SCS)。NVIC与内核相辅相成&#xff0c;共同完成对中断的响应。本章将介绍中断的优先级设置、如…

教育机构如何避免数据泄露?两种方法保护数据安全

随着数字化时代的发展&#xff0c;教育机构的很多信息都以数字化的方式存储在计算机或移动存储设备中。为了避免数据泄露&#xff0c;我们需要加密保护重要数据。下面我们就来了解一下教育机构避免数据泄露的方法。 超级加密3000 电脑在教育行业中扮演着重要的角色&#xff0c…

阿里云万网推出首个域名AI大模型智能体应用,上线“.ai”等40个全新域名后缀

中国域名保有量3160万&#xff0c;以9.4%的份额位居全球第二。 域名资源越来越紧张&#xff0c;运维越来越复杂&#xff0c;面对的网络攻击也越来越频繁&#xff0c;都给这一领域提出了更大挑战。 8月8日&#xff0c;在阿里云万网焕新发布会上&#xff0c;阿里云宣布域名产品服…

waf绕过:网络安全狗绕过

引言&#xff1a; 所有的绕过原理都大致一致&#xff0c;但是并不是所有的绕过都能起到作用&#xff0c;渗透测试主要还是一个猜加试的过程&#xff0c;本文仅供参考 网络攻击或扫描绕过 1.get绕过&#xff08;未开启cc防护&#xff09; 网络安全狗的默认防护为&#xff0c;拒…

【C++】模拟实现reverse_iterator(反向迭代器适配器)

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:实战项目集 ⚙️操作环境:Visual Studio 2022 目录 一.了解项目功能 &#x1f4cc;什么是适配器 &#x1f4cc;了解reverse_iterator官方标准 &#x1f4cc;了解模拟实现reverse_iterator 二.逐步实现项目功能模块及…

【C++综合项目】——基于Boost库的搜索引擎(手把手讲解,小白一看就会!!)

目录 一、前言 二、项目的相关背景 ⚡什么是Boost库&#xff1f;⚡ ⚡什么是搜索引擎&#xff1f;⚡ ⚡为什么要做Boost搜索引擎&#xff1f;⚡ 二、搜索引擎的宏观原理 三、搜索引擎技术栈和项目环境 四、正排索引 VS 倒排索引 —— 搜索引擎的具体原理 &#x…

leetcode22. 括号生成,DFS深度优先搜索

leetcode22. 括号生成 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”] 示例 2&am…

SQL面试题练习 —— 最后一次登录停留时长

目录 1 题目2 建表语句3 题解 题目来源&#xff1a;腾讯微信。 1 题目 有一张用户登录日志表ods_usr_login_log, 包含user_id&#xff08;用户id&#xff09;、ds&#xff08;登录时间&#xff09;以及stay_time&#xff08;停留时长&#xff0c;单位:ms&#xff09; 问题&…

再等等,iPhone 17系列大革新,即将带来颠覆性的升级

自从苹果在2021年的iPhone 13 Pro系列中引入了ProMotion自适应刷新率技术以来&#xff0c;这项技术便成为了高端智能手机显示技术的重要标志。 如今&#xff0c;随着iPhone 17系列即将登场&#xff0c;我们有望见证这项技术向下一代更广泛的设备拓展。不仅如此&#xff0c;iPh…

每日一题~ abc 365 E 异或运算(拆位+贡献)

处理位运算常用的方法&#xff1a; 拆位法&#xff08;一位一位的处理&#xff0c;通常题目中会给出元素的最大是2的的多少次幂&#xff0c;当然也有给10的次幂的&#xff0c;自己注意一下就可以了&#xff09; 常用的思想 &#xff1a; 算贡献。 异或的性质&#xff1a; A^A0 …

抖音外卖区域服务商有哪些城市开放了?搭建本地生活系统抢先入局的成功率如何?

随着多家互联网大厂对本地生活重视程度的不断提高&#xff0c;本地生活服务商逐渐成为众多创业者心目中的首选赛道。在此背景下&#xff0c;抖音外卖区域服务商的申请通道一经开放便引发了一阵申请热潮。 毕竟&#xff0c;根据艾瑞咨询数据预测&#xff0c;到2025年&#xff0…

Linux5.15.71编译问题处理

目录 1 编译环境及源码版本2 移植Linux 5.15.71遇到问题2.1 imx-sdma 20ec000.dma-controller: Direct firmware load for imx/sdma/sdma-imx6q.bin failed with error -22.2 cfg80211: failed to load regulatory.db 1 编译环境及源码版本 ​ 1. uboot-alientek-v2022.04 ​…

红酒与亚洲菜肴:品味东方韵味

当西方的红酒遇上东方的菜肴&#xff0c;一场跨越地域与文化的味蕾盛宴就此展开。洒派红酒&#xff08;Bold & Generous&#xff09;与亚洲菜肴的相遇&#xff0c;不仅是一场美食的邂逅&#xff0c;更是一次对东方韵味的深度品味。 一、红酒的醇厚与亚洲菜肴的精致 红酒&…

【Unity程序】和【控制台程序】连接【asp.net core的websocket服务】(1)——在编辑器中运行

一、说明 1、本文实验内容所涉及的开发环境说明&#xff1a; win11VisualStudio2022&#xff08;.Net6.0&#xff09;Unity2021.3.40 2、本文参考资料 【1】NativeWebSocketUnity包&#xff1a; https://github.com/endel/NativeWebSocket 【2】asp.net core架设websocket国…

【安卓】SharedPreferences存储

SharedPreferences使用键值对的方式来存储数据的。也就是说&#xff0c;当保存一条数据的时候&#xff0c;需要给这条数据提供一个对应的键&#xff0c;这样在读取数据的时候就可以通过这个键把相应的值取出来。而且SharedPreferences还支持多种不同的数据类型存储&#xff0c;…

游戏原画可节省60-80%工时,大厂在用AI做什么

AIGC技术的迭代&#xff0c;是不是太快了点&#xff1f; 前年年中还是光速出图的Stable Diffusion&#xff0c;到年底就有了可以媲美真人的文本处理模型ChatGPT&#xff0c;今年开年又蹦出来了可以凭空变出视频、动画的Sora……我们对技术升级的认知被一次次刷新&#xff0c;同…

BHGMall生活超市天通苑店盛大开业,多重好礼只等你来

据悉8月10日&#xff0c;BHGMall生活超市天通苑店焕新开业&#xff0c;催旺“七夕浪漫经济”造福社区百姓&#xff0c;不仅提供助老服务&#xff0c;还有超值福利、多重好礼&#xff0c;倡导天天有低价&#xff0c;以实惠的价格买到优质的商品&#xff0c;提升居民幸福感和城市…

解题思考:为什么Java中使用Arrays.stream()创建流处理数组通常会增加开销,提高时间复杂度?

目录 问题描述&#xff1a;问题回答&#xff1a; 问题描述&#xff1a; 在解决力扣上的&#xff1a; 3131. 找出与数组相加的整数 I 时&#xff0c;使用传统遍历会比创建流处理数组的时间复杂度更低。 1.传统遍历代码&#xff1a; class Solution {public int addedInteger(i…