链表面试编程题

news2024/12/23 12:06:28

1. 删除链表中等于给定值 val 的所有节点。 203. 移除链表元素 - 力扣(LeetCode)

2. 反转一个单链表。206. 反转链表 - 力扣(LeetCode)

3. 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回

第二个中间结 点。876. 链表的中间结点 - 力扣(LeetCode)

4. 输入一个链表,输出该链表中倒数第k个结点。面试题 02.02. 返回倒数第 k 个节点 - 力扣(LeetCode)

5. 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。21. 合并两个有序链表 - 力扣(LeetCode)

6. 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 。链表分割_牛客题霸_牛客网 (nowcoder.com)

7. 链表的回文结构。链表的回文结构_牛客题霸_牛客网 (nowcoder.com)

 8. 输入两个链表,找出它们的第一个公共结点160. 相交链表 - 力扣(LeetCode)

9. 给定一个链表,判断链表中是否有环。 141. 环形链表 - 力扣(LeetCode)

10.给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 NULL

142. 环形链表 II - 力扣(LeetCode)

 1. 删除链表中等于给定值 val 的所有节点。 203. 移除链表元素 - 力扣(LeetCode)​​​​​

class Solution {
    public ListNode removeElements(ListNode head, int val) {
      if(head==null){
            return head;
        }
        ListNode prev=head;
        ListNode cur=head.next;
        while(cur!=null){
            if(cur.val==val){
                prev.next=cur.next;
                cur=cur.next;
            }else{
                prev=cur;
                cur=cur.next;
            }
        }
        if(head.val==val){
            head=head.next;
        }
        return head;
}
}

 

 2. 反转一个单链表。206. 反转链表 - 力扣(LeetCode)

 方法一:头插法

class Solution {//方法一:头插法
    public ListNode reverseList(ListNode head) {
        if(head==null){
            return head;
        }
        ListNode   cur=head.next;
        head.next=null; 
        while(cur!=null){
                ListNode curN=cur.next;
                cur.next=head;
                head=cur;
                cur=curN;

        }
        return 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 reverseList(ListNode head) {
        if(head==null){
            return head;
        }
        ListNode save;
        ListNode cur=head.next;
        head.next=null;
        while(cur!=null){
            save=cur.next;
            cur.next=head;
        head=cur;
        cur=save;
        }
        return head;

    }
}

 3. 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结 点。876. 链表的中间结点 - 力扣(LeetCode)

方法一:快慢指针法

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;

    }
}

 4. 输入一个链表,输出该链表中倒数第k个结点。面试题 02.02. 返回倒数第 k 个节点 - 力扣(LeetCode)

方法:依旧是快慢指针法,快指针先走k-1步,紧接着一起走,快指针走到null时,slow指针的值就是倒数第k个节点,需要注意的是,确保k符合条件

class Solution {
    public int kthToLast(ListNode head, int k) {
        ListNode slow=head;
        ListNode fast=head;
        while(k-1>0){
            fast=fast.next;
            k--;
        }
        while(fast.next!=null){
            fast=fast.next;
            slow=slow.next;
        }
        return slow.val;

    }
}

 5. 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。21. 合并两个有序链表 - 力扣(LeetCode)

方法:创建傀儡节点/虚拟节点,小的进行尾插

class Solution {
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        ListNode head=new ListNode(0);
        ListNode cur=head;
        while(list1!=null&&list2!=null){
            if(list1.val>list2.val){
                 cur.next=list2;
                list2=list2.next;
                cur=cur.next;
             
         
            }else{
                  cur.next=list1;
                list1=list1.next;
                cur=cur.next;
            }
        }

        if(list1!=null){
        cur.next=list1;
       
          
        }
        if(list2!=null){
        cur.next=list2;
    
        }
        return head.next;

    }
}

 6. 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 。链表分割_牛客题霸_牛客网 (nowcoder.com)

方法:依旧使用两个虚拟节点/傀儡节点,小于x的放在一个虚拟节点内,大于等于x的放在另一个虚拟节点内,最后进行拼接

public class Partition {
    public ListNode partition(ListNode pHead, int x) {
        ListNode nx=new ListNode(0);
        ListNode xn=new ListNode(0);
        ListNode cur=pHead;
        ListNode as=nx;
        ListNode bs=xn;
        while(cur!=null){
            if(cur.val<x){
                nx.next=cur;
                cur=cur.next;
                nx=nx.next;
            }else{
                xn.next=cur;
                cur=cur.next;
                xn=xn.next;
            }
        }
        nx.next=bs.next;
        xn.next=null;
        return as.next;
    }
}

 7. 链表的回文结构。链表的回文结构_牛客题霸_牛客网 (nowcoder.com)

先寻找中间节点

再从中间节点往后翻转

从后往前循环判断,判断过程中分奇偶判断,内补实现偶数判断返回true,循环结束为奇数判断结束,返回true

    public boolean chkPalindrome(ListNode A) {
        if(A==null){
            return true;
        }
        // write code here
        ListNode slow=A;
        ListNode fast=A;
        while(fast!=null&&fast.next!=null){
            fast=fast.next.next;
            slow=slow.next;
        }
    ListNode cur=slow.next;
    while(cur!=null){
        ListNode curN=cur.next;
        cur.next=slow;
        slow=cur;
        cur=curN;
    }//从中间节点开始,翻转另一边链表
    while(A!=slow){
        if(A.val!=slow.val){
            return false;
        }
        if(A.next==slow){//偶数特例
            return true;
        }
        A=A.next;
        slow=slow.next;
    }
    return true;//奇数例子
    }

也可以不用判断奇数偶数,及时给找到中间节点后的slow的next置空就好啦

8. 输入两个链表,找出它们的第一个公共结点160. 相交链表 - 力扣(LeetCode)

ublic ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode pl=headA;
        ListNode ps=headB;
        int countA=0;
        int countB=0;
        while(pl!=null){
            countA++;
            pl=pl.next;
        }
        while(ps!=null){
            countB++;
            ps=ps.next;
        }
        int len=countA-countB;
        pl=headA;
        ps=headB;
        if(len<0){
            len=countB-countA;
            pl=headB;
            ps=headA;
        }
        while(len>0){
            pl=pl.next;
            len--;
        }
        while(pl!=ps){
            pl=pl.next;
            ps=ps.next;
        }
        if(pl==null){
            return null;
        }
        return pl;
    }

 9. 给定一个链表,判断链表中是否有环。141. 环形链表 - 力扣(LeetCode)

  public boolean hasCycle(ListNode head) {
        if(head==null){
            return false;
        }
            ListNode fast=head;
            ListNode slow=head;
            while(fast!=null&&fast.next!=null){
                slow=slow.next;
                fast=fast.next.next;
                if(fast==slow){
                        return true;
                }
            }
            return false;
    }

 10.给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 NULL

142. 环形链表 II - 力扣(LeetCode)

结论
让一个指针从链表起始位置开始遍历链表,同时让一个指针从判环时相遇点的位置开始绕环运行,两个指针 都是每次均走一步,最终肯定会在入口点的位置相遇
证明:
  public ListNode detectCycle(ListNode head) {
         if(head==null){
            return null;
        }
            ListNode Head=head;
            ListNode fast=head;
            ListNode slow=head;
            while(fast!=null&&fast.next!=null){
                slow=slow.next;
                fast=fast.next.next;
                if(fast==slow){
                        while(Head!=slow){
                            Head=Head.next;
                            slow=slow.next;
                            
                        }
                        if(slow==Head){
                                return Head;
                            }
                }
            }
            return null;
    }

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

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

相关文章

FOCShield v2.0.4原理图

1.FOCShield v2.0.4原理图,开源原文件用AD制作。用 AD09可以打开。 主要部分为 1.电机驱动芯片部分 2.电流采样部分

2024 全新体验:国学心理 API 接口来袭

在当今快节奏的生活中&#xff0c;人们对于心理健康越来越重视。而研究发现&#xff0c;国学心理学乃至传统文化中的思想智慧&#xff0c;对于人们的心理健康有着独特且深远的影响。为了让更多人能够体验到国学心理的魅力&#xff0c;2024年全新推出的国学心理 API 接口&#x…

Efficient Knowledge Infusion via KG-LLM Alignment

文章目录 题目摘要引言相关作品方法论实验设置和结果分析结论局限性附录 题目 通过KG-LLM比对实现高效的知识注入 论文地址&#xff1a;https://aclanthology.org/2024.findings-acl.176.pdf 摘要 为了解决大型语言模型中特定领域知识匮乏的问题&#xff0c;知识图检索扩充方…

27 Vue3之unocss原子化

前置知识 什么是原子化 CSS 原子化 CSS 是一种 CSS 的架构方式&#xff0c;它倾向于小巧且用途单一的 class&#xff0c;并且会以视觉效果进行命名。 为什么使用 原子化 CSS 传统方案 制作原子化 CSS 的传统方案其实就是提供所有你可能需要用到的 CSS 工具。例如&#xff0c…

ES索引生命周期管理

基于如何 定时删除ES索引过期数据 而引发的一系列关于ES索引生命周期管理ILM(Index Lifecycle Management)的学习 快速上手 &#xff1a;定时删除ES索引中的过期数据 1. ILM解决什么问题&#xff1f; ES从6.7版本引入ILM&#xff0c;通过ILM可以解决哪些问题呢? 自动新建…

Python 课程22-Pillow

前言 Pillow 是一个 Python 图像处理库&#xff0c;是 Python Imaging Library (PIL) 的升级版。Pillow 提供了对常见图像文件格式&#xff08;如 PNG、JPEG、GIF 等&#xff09;的支持&#xff0c;并允许你进行图像裁剪、调整大小、旋转、滤镜应用、文本添加等操作。Pillow 广…

Applio:颠覆语音克隆的AI黑科技!

Applio&#xff1a;颠覆语音克隆的AI黑科技&#xff01; Applio是一个神奇的AI语音克隆工具✨&#xff0c;提供超过20,000种声音模型&#x1f3a4;&#xff0c;让你轻松创造独特音色&#x1f3b6;&#xff01;开源社区欢迎所有人参与&#xff0c;共同探索AI音频的无限可能&…

蓝桥杯备赛---2.新建工程

推荐根据视频进行工程建立 开发板资源简介&工程模板建立_哔哩哔哩_bilibili 目录 推荐根据视频进行工程建立 1.点击"File"下的"New Project"新建一个工程 ​编辑 2. 查看官方给的数据手册&#xff0c;选择对于的单片机型号 3. 查看原理图&#…

银河麒麟操作系统中设置进程堆栈大小的方法

银河麒麟操作系统中设置进程堆栈大小的方法 1、临时修改堆栈大小步骤一&#xff1a;查看当前堆栈大小步骤二&#xff1a;修改堆栈大小 2、永久修改堆栈大小步骤一&#xff1a;查看当前堆栈大小&#xff08;可选&#xff09;步骤二&#xff1a;编辑配置文件步骤三&#xff1a;注…

论文精读--Two-Stream Convolutional Networks for Action Recognition in Videos

对于单张图片&#xff0c;丢进卷积和全连接层直接得出分类结果就行 但对于视频&#xff0c;早期的一些工作把视频中的一些关键帧抽取出来&#xff0c;把一个个帧通过网络&#xff0c;最后把结果合并&#xff0c;或者把帧叠起来&#xff0c;一起丢进网络。在网络中进行early fu…

【C++】模拟实现红黑树

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:实战项目集 ⚙️操作环境:Visual Studio 2022 目录 一.了解项目功能 二.逐步实现项目功能模块及其逻辑详解 &#x1f4cc;实现RBTreeNode类模板 &#x1f38f;构造RBTreeNode类成员变量 &#x1f38f;实现RBTreeNode类构…

【数据结构】堆(Heap)详解----定义堆、初始化,删除、插入、销毁、判空、取堆顶

文章目录 一、堆的概念及其性质&#xff1a;堆的概念&#xff1a;堆的性质&#xff1a; 二、堆的定义及其基础操作的代码实现&#xff08;C语言版&#xff09;1.定义堆2.堆的初始化3.堆的销毁4.堆的插入5.堆的删除6.取堆顶的数据7.堆的数据个数8.堆的判空 总结&#xff1a; 提示…

Python开发环境配置(mac M2)

1. 前言 作为一名程序员&#xff0c;工作中需要使用Python进行编程&#xff0c;甚至因为项目需要还得是不同版本的Python如何手动管理多个版本的Python&#xff0c;如何给Pycharm&#xff08;IDE&#xff09;配置对应的interpreter等&#xff0c;都成为一个 “不熟练工” 的难…

【面向对象】设计模式概念和分类

零.前提提要 本文章是我考中级软件设计师时的笔记&#xff0c;基本都是一些自己的思路和见解&#xff0c;现记录一下&#xff0c;希望可以帮助到即将考证的同学。 一.面向对象设计模式的概念 二.面向对象的设计模式分类 设计模式确定了所包含的类和实例、他们的角色和写作方式以…

AMBER学习记录--使用Multiwfn计算有机小分子的RESP电荷--问题及解决

1 ORCAMultiwfn在wsl中的安装 ORCA的安装参考量子化学程序ORCA的安装方法 - 思想家公社的门口&#xff1a;量子化学分子模拟二次元 (sobereva.com) Multiwfn的安装 参考保姆级安装Linux版Multiwfn教程_multiwfn安装过程-CSDN博客 2 计算C3G的RESP电荷 2.1从pubchem上下载C3G的…

77. 组合【含回溯详解、N叉树类比、剪枝优化】

文章目录 77. 组合思路暴力法回溯与N叉树类比回溯法三部曲 总结剪枝优化剪枝总结 77. 组合 77. 组合 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&am…

spring loCDI 详解

文章目录 一、IoC & DI 基本知识1.1 IoC 的基本概念&#xff1a;1.2 IoC 的优势&#xff1a;1.3 DI 介绍&#xff1a; 二、IoC 详解2.1 Spring 容器&#xff1a;2.2 被存储 Bean 的命名约定&#xff1a;2.3 Bean 的存储方式&#xff1a;2.3.1 五大类注解&#xff1a;2.3.1.…

MySQL高阶2010-职员招聘人数2

目录 题目 准备数据 分析数据 总结 题目 一家公司想雇佣新员工。公司的工资预算是 $70000 。公司的招聘标准是&#xff1a; 继续雇佣薪水最低的高级职员&#xff0c;直到你不能再雇佣更多的高级职员。用剩下的预算雇佣薪水最低的初级职员。继续以最低的工资雇佣初级职员&…

linux文件编程_进程

1. 进程相关概念 面试中关于进程&#xff0c;应该会问的的几个问题&#xff1a; 1.1. 什么是程序&#xff0c;什么是进程&#xff0c;有什么区别&#xff1f; 程序是静态的概念&#xff0c;比如&#xff1a; 磁盘中生成的a.out文件&#xff0c;就叫做&#xff1a;程序进程是…

Linux常用语法

Linux常用语法 0.引言特殊路径符Linux 命令基础格式重要命令mkdir命令echo-tail命令 vi\vim编辑器的三种工作模式vi/vim简单介绍基础命令 运行模式命令模式下的快捷键 进程管理进程的命令 Linux解压缩tar格式zip命令unzip命令 ping,wget,curl等命令的使用Linux端口端口端口的划…