iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java八道经典面试题之链表题
  • 176
分享到

Java八道经典面试题之链表题

2024-04-02 19:04:59 176人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录第一题 移除链表元素第二题 反转链表第三题 链表的中心结点第四题 倒数第k个结点第五题 合并两个有序链表第六题 链表分割第七题 判断是否回文第八题 相交链表第一题 移除链表元素

第一题 移除链表元素

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

输入:head = [1,2,6,3,4,5,6], val = 6

输出:[1,2,3,4,5]

这道题还是比较简单的我们需要让删除的节点的前一个结点指向删除节点的后一个就行。就比如cur.next==cur.next.next;。


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

第二题 反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

输入:head = [1,2,3,4,5]

输出:[5,4,3,2,1]

这也是一个简单题,我们还是先弄一个尾结点,因为链表的最后一个结点的下一个是一个null,这道题我们可以通过一次循环让后一个结点的下一个结点指向前一个结点。


class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode pre =null;
        ListNode cur=head;
        while(cur!=null){
            ListNode next=cur.next;
            cur.next=pre;
            pre=cur;
            cur=next;
        }
      
return pre;
    }
}

第三题 链表的中心结点

给定一个头结点为 head 的非空单链表,返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

答:这个也是一个简单题我们需要用到快慢指针,当快指针指完之后,慢的结点肯定是中点比如18 快的可以走9步每次走两步走到18,慢的可以每次走一部走9步。刚好到中点。


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

    }
}

第四题 倒数第k个结点

输入一个链表,输出该链表中倒数第k个结点

输入:

1,{1,2,3,4,5}

复制

返回值:

{5}

答:这道题也是一个简单题,直接简单粗暴的搞出来倒数第k个点的值就行;


public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        
        ListNode cur=head;
        ListNode pre=head;
        int count=0;
        int x=0;
        
        while(cur!=null){
            
            cur=cur.next;
            count++;
        }
        if(k<0||k>count){
            return null;
        }
        while(pre!=null){
             if(x==count-k){
               break;
            }else{
            pre=pre.next;
            x++;
             }
        }
 return pre;
    }
}

这道题写的有点麻烦了,我们也可以用快慢指针做。一个指针走5步一个走4步。


public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        ListNode p=head;
        ListNode q=head;
       for(int i = 0; i < k; i++) {
           if (p != null) {
            p= p.next;
        } else {
            return null;
        }
    }
        while(p!=null){
            p=p.next;
            q=q.next;
        }
        return q;
    }
}

第五题 合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

输入:l1 = [1,2,4], l2 = [1,3,4]

输出:[1,1,2,3,4,4]

答:这道题考到了怎么将两个链表合并,我们需要将两个链表从大到小合并起来。


class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
       ListNode dummyHead = new ListNode(0);
        ListNode cur = dummyHead;
        while (l1 != null && l2 != null) {
            if (l1.val < l2.val) {
                cur.next = l1;
                cur = cur.next;
                l1 = l1.next;
            } else {
                cur.next = l2;
                cur = cur.next;
                l2 = l2.next;
            }
        }
        // 任一为空,直接连接另一条链表
        if (l1 == null) {
            cur.next = l2;
        } else {
            cur.next = l1;
        }
        return dummyHead.next;
    }
}

第六题 链表分割

现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。

输入:l1 = [1,2,1,3,2] 3

输出:[1,2,1,2,3]

这道题比较难了需要我们创建两个链表,一个数大与等于x的链表,另一个数小于x的链表。然后让上一个链表的下一个尾结点指向下一个结点的尾巴结点。

这里我们需要用到如何将两个链表合并成一个链表。

做题的时候先想怎么做然后在动手!


public class Partition {
    public ListNode partition(ListNode pHead, int x) {
        if(pHead == null || pHead.next == null) {
            return pHead;
        }
        ListNode newHead = new ListNode(0);
        ListNode flagHead = new ListNode(0);
        ListNode newh = newHead;
        ListNode flagh = flagHead;
        while(pHead != null){
            if(pHead.val < x){
                newh.next = new ListNode(pHead.val);
                newh = newh.next;
            }else{
                flagh.next = new ListNode(pHead.val);
                flagh = flagh.next;
            }
            pHead = pHead.next;
        }
        newh.next = flagHead.next;
        return newHead.next;
    }
}

第七题 判断是否回文

对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。

给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。

1->2->2->1

返回:true


public class PalindromeList {
    public boolean chkPalindrome(ListNode head) {
        // write code here 
        ListNode fast=head;
        ListNode slow=head;
        while(fast!=null && fast.next!=null) {
            fast = fast.next.next;
            slow = slow.next;
        }
         ListNode cur=slow.next;
        while(cur!=null){
            ListNode curNext=cur.next;
            cur.next=slow;
            slow=cur;
            cur=curNext;
        }
        //3.一个从前往后,一个从后往前  如果相遇,则证明回文
        while(head!=slow){
            if(head.val!=slow.val){//先判断值是否相等
                return false;
            }
            if(head.next==slow){//偶数情况下
                return true;
            }
            head=head.next;
            slow=slow.next;
    }
        return true;    
}

第八题 相交链表

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

可以用笨方法就是计算出来每个链表的个数然后让多的先走。


public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if (headA == null || headB == null) {
            return null;
        }
                ListNode last = headB;
        while (last.next != null) {
            last = last.next;
        }
last.next = headB;

        ListNode fast = headA;
        ListNode slow = headA;

        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
            if (slow == fast) {
                slow = headA;
                while (slow != fast) {
                    slow = slow.next;
                    fast = fast.next;
                }
                last.next = null;
                return fast;
            }
        }
        last.next = null;
        return null;
    }
}

到此这篇关于Java 八道经典面试题之链表题的文章就介绍到这了,更多相关Java 链表题内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java八道经典面试题之链表题

本文链接: https://www.lsjlt.com/news/158839.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java八道经典面试题之链表题
    目录第一题 移除链表元素第二题 反转链表第三题 链表的中心结点第四题 倒数第k个结点第五题 合并两个有序链表第六题 链表分割第七题 判断是否回文第八题 相交链表第一题 移除链表元素 ...
    99+
    2024-04-02
  • Java面试题经典面试题220道(附答案)
    Java基础: JDK 和 JRE 有什么区别? == 和 equals 的区别是什么?== 解读 两个对象的 hashCode() 相同, 那么 equals() 也一定为 true吗? final 在 Java 中有什么作用? ...
    99+
    2023-09-06
    java 面试 jvm
  • Nacos经典7道面试题
    Nacos中的保护阈值的作用是什么? 假如现在有一个服务,本来有10个实例,但是现在挂掉了8个,剩下2个正常实例,此时本来由10个实例处理的流量,就全部交给这个两个正常实例来处理了,此时这两个实例很有可能是处理不过来的,最终导致被压垮,为了...
    99+
    2023-08-16
    java spring cloud
  • Mysql经典面试题20道
    我整理的必刷SQL经典题目 SQL语句在工作与面试时都必不可少,下面我整理了20道题目供大家练习,常见的使用方法和开窗函数都有考察,来测测你的sql技能是否过关。 一、创建表 共有4个表,分别是学生信息表、课程表、老师信息表和成绩表。 1 ...
    99+
    2023-08-22
    mysql 面试 数据库
  • Java 详细分析四个经典链表面试题
    前言: 上一章更到了链表,虽然知道了什么是链表,链表的结构是怎么样的,但这是远远不够的,我们只清楚了点皮毛,如果让你做题你还是会无从下手,所以我们必须多做题,在做题的过程中慢慢的我们...
    99+
    2024-04-02
  • Java经典面试题最全汇总208道(六)
    目录前言 181、什么是类加载器,类加载器有哪些?182、说一下类加载的执行过程?183、JVM的类加载机制是什么?184、什么是双亲委派模型?185、怎么判断对象是否可以...
    99+
    2023-01-17
    Java面试题 Java经典面试题
  • Java经典面试题最全汇总208道(二)
    目录前言 53、concurrentHashMap和HashTable有什么区别54、HasmMap和HashSet的区别55、请谈谈 ReadWriteLock 和 St...
    99+
    2023-01-17
    Java面试题 Java经典面试题
  • Python经典面试题
    #1.字符串最后一个单词的长度 题目描述:计算字符串最后一个单词的长度,单词以空格隔开。 输入描述: 一行字符串,非空,长度小于5000。输出描述: 整数N,最后一个单词的长度。 示例1:输入:hello world输出:5参考代码一:...
    99+
    2023-01-31
    面试题 经典 Python
  • pyntho经典面试题
    Python基础篇 1:为什么学习Python 2:通过什么途径学习Python 3:谈谈对Python和其他语言的区别 Python的优势: 4:简述解释型和编译型编程语言 5:Python的解释器种类以及相关特点? 6:位和字节...
    99+
    2023-01-30
    面试题 经典 pyntho
  • Oracle的四道经典面试题分享
    前言 本文整理了4道Oracle 经典面试题,与大家分享学习。这也许是你一直期待的文章,下面话不多说了,来一起看看详细的介绍吧 第一题 create table test( id number(10)...
    99+
    2024-04-02
  • 40道Python经典面试题(附答案)
    1)什么是Python?使用Python有什么好处? Python是一种编程语言,包含对象,模块,线程,异常和自动内存管理。Python的好处在于它简单易用,可移植,可扩展,内置数据结构,并且它是一...
    99+
    2023-10-03
    python python自学 开发语言 面试 面试题目
  • Java经典面试题总结(一)
    Java经典面试题总结(一) 题一:Java编译运行原理题二:JDK,JVM,JRE三者之间的关系题三:谈一下对冯诺依曼体系的了解题四:重载与重写的区别题五:拆箱装箱是指什么? 题一:Java编译运行原理 Java源代码通过...
    99+
    2023-08-30
    java 开发语言
  • Java经典面试题汇总:Mybatis
    目录1. MyBatis 中 #{}和 ${}的区别是什么?2. MyBatis 有几种分页方式?3. MyBatis 逻辑分页和物理分页的区别是什么?4. MyBatis 是否支持...
    99+
    2024-04-02
  • Java经典面试题汇总:JVM
    目录1. 说一下 JVM 的主要组成部分?及其作用?2. 说一下 JVM 运行时数据区?3. 说一下堆栈的区别?4. 解释内存中的栈(stack)、堆(heap)和静态区(stati...
    99+
    2024-04-02
  • Java经典面试题汇总:Spring
    目录1. 什么是Spring? 有哪些优点?2. 什么是 AOP?3. 什么是 IOC?4. 什么是 DI?5. Spring 有哪些核心模块?6. Spring 常...
    99+
    2024-04-02
  • Java经典面试题汇总:Java Web
    目录1. JSP 和 servlet 有什么区别?2. 什么是Tomcat?3. Tomcat容器是如何创建Servlet类实例?用到了什么原理?4. 拦截器和过滤器的区别?...
    99+
    2024-04-02
  • Java经典面试题汇总:异常
    目录1. Java的异常机制2. Java如何自定义异常?3. throw 和 throws 的区别?4. Java 中被检查的异常和不受检查的异常有什么区别?5. final、fi...
    99+
    2024-04-02
  • Java经典面试题汇总:Spring Boot
    目录1. 什么是 Spring Boot?2. 为什么要用 Spring Boot? 3. Spring Boot 核心配置文件是什么?4. Spring Boot 提供了...
    99+
    2024-04-02
  • Java经典面试题汇总:Spring MVC
    目录1. 什么是Spring MVC ?2. Spring MVC 有哪些组件?3. 说一下 Spring MVC 运行流程?4. Spring MVC的优点:5. @Request...
    99+
    2024-04-02
  • 一道超经典js面试题Foo.getName()的故事
    目录一、解析:1.Foo.getName()二、解析:2.getName()三、解析:3.Foo().getName()四、解析:4.getName()五、解析:5.new Foo....
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作