java链表的常见简单面试算法题详解

 更新时间:2025年01月07日 09:24:07   作者:石以砥焉,以锐为利  
文章总结:本文主要介绍了单链表的基本操作,包括头插法、尾插法、链表翻转、链表成环判断、成环位置判断、成环长度判断,以及有序链表的合并,通过实例和代码示例,详细讲解了每种操作的原理和实现方法

java链表的常见面试算法题

头插法、尾插法

头插法:先待插入指向头结点的next,后头结点的next指向待插入。

尾插法:借助尾指针,直接插入

 /**
     * 头插法
     * @param head
     * @return
     */
    public static Node head_insert(Node head, int t){
        Node node=new Node(t);
        node.setNext(head.getNext());
        head.setNext(node);
        return head;
    }

    /**
     * 尾插法
     * @param head
     * @return
     */
    public static Node tail_insert(Node head,int t){
        Node tail=head;
        Node target=new Node(t);
        while (tail.getNext()!=null){
            tail=tail.getNext();
        }
        tail.setNext(target);
     return head;
    }
}

单链表翻转

力扣:LCR 024. 反转链表

将翻转前的链表记pre,翻转后的记next(也是head)。结点依次翻转。

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

链表成环判断

力扣:141. 环形链表

定义两个指针slow、fast,slow走一步,fast走两步遍历链表。相遇就有环

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

    }
}

链表成环位置判断

力扣:LCR 022. 环形链表 II

(1)定义一个A指针(指向开始点A)、B指针(指向相遇点B)。以相同速度移动,相遇点就是环的入口。

public class Solution {
    public ListNode detectCycle(ListNode head) {
        Boolean result=false;
        ListNode slow=head;
        ListNode fast=head;
        while (slow!=null&&fast!=null&&fast.next!=null){
           slow=slow.next;
           fast=fast.next.next;
           if(slow==fast){
               result=true;
               break;
           }
        }
        if(result==false){
         return null;
        }
        slow=head;
        while (slow!=fast){
            slow=slow.next;
            fast=fast.next;
        }
        return slow;
    }
}

(2)为什么慢指针和快指针相遇时一定没走完一圈?

将环平铺展开,假设慢指针走完一圈了,快指针走两圈的距离。在下图中看出快指针已经超过了慢指针,中途一定有相遇的瞬间。

链表成环长度判断

在上一题找到环入口的前提下,再定义一个指针,绕一圈环并记数。

有序链表的合并

力扣:21. 合并两个有序链表

定义一个pre指针,始终指向已经排好序的链表尾结点。定义一个虚拟节点作为pre的初始节点。

依次遍历两个链表取出小的那个结点作为pre的下一个结点。

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 使用Jackson 处理 null 或者 空字符串

    使用Jackson 处理 null 或者 空字符串

    这篇文章主要介绍了使用Jackson 处理 null 或者 空字符串,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java字符串原理分析之String是否可变

    Java字符串原理分析之String是否可变

    当我们在求职时,面试官很喜欢问我们关于String的一些原理性知识,比如String的不可变性、字符串的内存分配等,为了让大家更好地应对面试,并理解String的底层设计,接下来会给大家聊聊String的一些原理,比如String为什么具有不可变性,需要的朋友可以参考下
    2023-05-05
  • IntelliJ IDEA 老司机居然还没用过 Stream Trace功能(问题小结)

    IntelliJ IDEA 老司机居然还没用过 Stream Trace功能(问题小结)

    很多朋友酷爱Java8 Stream功能,但是在使用过程中总不是那么顺利,下面通过本文给大家分享idea Stream Trace调试过程遇到的问题,需要的朋友参考下吧
    2021-05-05
  • 基于Luhn算法的银行卡校验规则

    基于Luhn算法的银行卡校验规则

    这篇文章主要为大家介绍了基于Luhn算法的银行卡校验规则,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • java对ArrayList中元素进行排序的几种方式总结

    java对ArrayList中元素进行排序的几种方式总结

    在Java中,ArrayList类提供了多种排序方法,可以根据不同的需求选择适合的排序方法,下面这篇文章主要给大家介绍了关于java对ArrayList中元素进行排序的几种方式,需要的朋友可以参考下
    2024-08-08
  • Spring中利用IOC实现注入的方式

    Spring中利用IOC实现注入的方式

    Spring IOC(控制反转)实现依赖注入,将对象创建和依赖关系的管理交由Spring容器处理,通过注解或XML配置,实现对象之间的松耦合,提高代码复用性和可维护性
    2023-04-04
  • SpringBoot详细讲解通过自定义classloader加密保护class文件

    SpringBoot详细讲解通过自定义classloader加密保护class文件

    这篇文章主要介绍了SpringBoot通过自定义classloader加密class文件,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • Java数据结构中堆的向下和向上调整解析

    Java数据结构中堆的向下和向上调整解析

    堆是一颗完全二叉树,在这棵树中,所有父节点都满足大于等于其子节点的堆叫大根堆,所有父节点都满足小于等于其子节点的堆叫小根堆。堆虽然是一颗树,但是通常存放在一个数组中,父节点和孩子节点的父子关系通过数组下标来确定
    2021-11-11
  • spring启动后保证创建的对象不被垃圾回收器回收

    spring启动后保证创建的对象不被垃圾回收器回收

    最近看到一个问题是,spring在启动后如何保证创建的对象不被垃圾回收器回收?。所以本文结合jvm的垃圾回收机制和spring中的源代码做出自己的一点猜测。有需要的朋友们可以参考借鉴。
    2016-09-09
  • Java util.List如何实现列表分段处理

    Java util.List如何实现列表分段处理

    这篇文章主要介绍了Java util.List如何实现列表分段处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09

最新评论