欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java鏈表的常見(jiàn)簡(jiǎn)單面試算法題詳解

 更新時(shí)間:2025年01月07日 09:24:07   作者:石以砥焉,以銳為利  
文章總結(jié):本文主要介紹了單鏈表的基本操作,包括頭插法、尾插法、鏈表翻轉(zhuǎn)、鏈表成環(huán)判斷、成環(huán)位置判斷、成環(huán)長(zhǎng)度判斷,以及有序鏈表的合并,通過(guò)實(shí)例和代碼示例,詳細(xì)講解了每種操作的原理和實(shí)現(xiàn)方法

java鏈表的常見(jiàn)面試算法題

頭插法、尾插法

頭插法:先待插入指向頭結(jié)點(diǎn)的next,后頭結(jié)點(diǎn)的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;
    }
}

單鏈表翻轉(zhuǎn)

力扣:LCR 024. 反轉(zhuǎn)鏈表

將翻轉(zhuǎn)前的鏈表記pre,翻轉(zhuǎn)后的記next(也是head)。結(jié)點(diǎn)依次翻轉(zhuǎn)。

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;
    }
}

鏈表成環(huán)判斷

力扣:141. 環(huán)形鏈表

定義兩個(gè)指針slow、fast,slow走一步,fast走兩步遍歷鏈表。相遇就有環(huán)

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;

    }
}

鏈表成環(huán)位置判斷

力扣:LCR 022. 環(huán)形鏈表 II

(1)定義一個(gè)A指針(指向開(kāi)始點(diǎn)A)、B指針(指向相遇點(diǎn)B)。以相同速度移動(dòng),相遇點(diǎn)就是環(huán)的入口。

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)為什么慢指針和快指針相遇時(shí)一定沒(méi)走完一圈?

將環(huán)平鋪展開(kāi),假設(shè)慢指針走完一圈了,快指針走兩圈的距離。在下圖中看出快指針已經(jīng)超過(guò)了慢指針,中途一定有相遇的瞬間。

鏈表成環(huán)長(zhǎng)度判斷

在上一題找到環(huán)入口的前提下,再定義一個(gè)指針,繞一圈環(huán)并記數(shù)。

有序鏈表的合并

力扣:21. 合并兩個(gè)有序鏈表

定義一個(gè)pre指針,始終指向已經(jīng)排好序的鏈表尾結(jié)點(diǎn)。定義一個(gè)虛擬節(jié)點(diǎn)作為pre的初始節(jié)點(diǎn)。

依次遍歷兩個(gè)鏈表取出小的那個(gè)結(jié)點(diǎn)作為pre的下一個(gè)結(jié)點(diǎn)。

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;
   }
}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

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

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

    這篇文章主要介紹了使用Jackson 處理 null 或者 空字符串,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java字符串原理分析之String是否可變

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

    當(dāng)我們?cè)谇舐殨r(shí),面試官很喜歡問(wèn)我們關(guān)于String的一些原理性知識(shí),比如String的不可變性、字符串的內(nèi)存分配等,為了讓大家更好地應(yīng)對(duì)面試,并理解String的底層設(shè)計(jì),接下來(lái)會(huì)給大家聊聊String的一些原理,比如String為什么具有不可變性,需要的朋友可以參考下
    2023-05-05
  • IntelliJ IDEA 老司機(jī)居然還沒(méi)用過(guò) Stream Trace功能(問(wèn)題小結(jié))

    IntelliJ IDEA 老司機(jī)居然還沒(méi)用過(guò) Stream Trace功能(問(wèn)題小結(jié))

    很多朋友酷愛(ài)Java8 Stream功能,但是在使用過(guò)程中總不是那么順利,下面通過(guò)本文給大家分享idea Stream Trace調(diào)試過(guò)程遇到的問(wèn)題,需要的朋友參考下吧
    2021-05-05
  • 基于Luhn算法的銀行卡校驗(yàn)規(guī)則

    基于Luhn算法的銀行卡校驗(yàn)規(guī)則

    這篇文章主要為大家介紹了基于Luhn算法的銀行卡校驗(yàn)規(guī)則,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • java對(duì)ArrayList中元素進(jìn)行排序的幾種方式總結(jié)

    java對(duì)ArrayList中元素進(jìn)行排序的幾種方式總結(jié)

    在Java中,ArrayList類提供了多種排序方法,可以根據(jù)不同的需求選擇適合的排序方法,下面這篇文章主要給大家介紹了關(guān)于java對(duì)ArrayList中元素進(jìn)行排序的幾種方式,需要的朋友可以參考下
    2024-08-08
  • Spring中利用IOC實(shí)現(xiàn)注入的方式

    Spring中利用IOC實(shí)現(xiàn)注入的方式

    Spring IOC(控制反轉(zhuǎn))實(shí)現(xiàn)依賴注入,將對(duì)象創(chuàng)建和依賴關(guān)系的管理交由Spring容器處理,通過(guò)注解或XML配置,實(shí)現(xiàn)對(duì)象之間的松耦合,提高代碼復(fù)用性和可維護(hù)性
    2023-04-04
  • SpringBoot詳細(xì)講解通過(guò)自定義classloader加密保護(hù)class文件

    SpringBoot詳細(xì)講解通過(guò)自定義classloader加密保護(hù)class文件

    這篇文章主要介紹了SpringBoot通過(guò)自定義classloader加密class文件,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • Java數(shù)據(jù)結(jié)構(gòu)中堆的向下和向上調(diào)整解析

    Java數(shù)據(jù)結(jié)構(gòu)中堆的向下和向上調(diào)整解析

    堆是一顆完全二叉樹(shù),在這棵樹(shù)中,所有父節(jié)點(diǎn)都滿足大于等于其子節(jié)點(diǎn)的堆叫大根堆,所有父節(jié)點(diǎn)都滿足小于等于其子節(jié)點(diǎn)的堆叫小根堆。堆雖然是一顆樹(shù),但是通常存放在一個(gè)數(shù)組中,父節(jié)點(diǎn)和孩子節(jié)點(diǎn)的父子關(guān)系通過(guò)數(shù)組下標(biāo)來(lái)確定
    2021-11-11
  • spring啟動(dòng)后保證創(chuàng)建的對(duì)象不被垃圾回收器回收

    spring啟動(dòng)后保證創(chuàng)建的對(duì)象不被垃圾回收器回收

    最近看到一個(gè)問(wèn)題是,spring在啟動(dòng)后如何保證創(chuàng)建的對(duì)象不被垃圾回收器回收?。所以本文結(jié)合jvm的垃圾回收機(jī)制和spring中的源代碼做出自己的一點(diǎn)猜測(cè)。有需要的朋友們可以參考借鑒。
    2016-09-09
  • Java util.List如何實(shí)現(xiàn)列表分段處理

    Java util.List如何實(shí)現(xiàn)列表分段處理

    這篇文章主要介紹了Java util.List如何實(shí)現(xiàn)列表分段處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09

最新評(píng)論