java鏈表的常見簡單面試算法題詳解
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; } }
鏈表成環(huán)判斷
力扣:141. 環(huán)形鏈表
定義兩個指針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)定義一個A指針(指向開始點A)、B指針(指向相遇點B)。以相同速度移動,相遇點就是環(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)為什么慢指針和快指針相遇時一定沒走完一圈?
將環(huán)平鋪展開,假設慢指針走完一圈了,快指針走兩圈的距離。在下圖中看出快指針已經(jīng)超過了慢指針,中途一定有相遇的瞬間。
鏈表成環(huán)長度判斷
在上一題找到環(huán)入口的前提下,再定義一個指針,繞一圈環(huán)并記數(shù)。
有序鏈表的合并
力扣:21. 合并兩個有序鏈表
定義一個pre指針,始終指向已經(jīng)排好序的鏈表尾結點。定義一個虛擬節(jié)點作為pre的初始節(jié)點。
依次遍歷兩個鏈表取出小的那個結點作為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; } }
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
IntelliJ IDEA 老司機居然還沒用過 Stream Trace功能(問題小結)
很多朋友酷愛Java8 Stream功能,但是在使用過程中總不是那么順利,下面通過本文給大家分享idea Stream Trace調試過程遇到的問題,需要的朋友參考下吧2021-05-05SpringBoot詳細講解通過自定義classloader加密保護class文件
這篇文章主要介紹了SpringBoot通過自定義classloader加密class文件,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-04-04spring啟動后保證創(chuàng)建的對象不被垃圾回收器回收
最近看到一個問題是,spring在啟動后如何保證創(chuàng)建的對象不被垃圾回收器回收?。所以本文結合jvm的垃圾回收機制和spring中的源代碼做出自己的一點猜測。有需要的朋友們可以參考借鑒。2016-09-09Java util.List如何實現(xiàn)列表分段處理
這篇文章主要介紹了Java util.List如何實現(xiàn)列表分段處理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09