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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Servlet實現(xiàn)統(tǒng)計頁面訪問次數(shù)功能
這篇文章主要介紹了Servlet實現(xiàn)統(tǒng)計頁面訪問次數(shù)功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-04-04
MyBatis如何處理MySQL字段類型date與datetime
這篇文章主要介紹了MyBatis如何處理MySQL字段類型date與datetime問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
Spring Boot 集成 Mybatis Plus 自動填充字段的實例詳解
這篇文章主要介紹了Spring Boot 集成 Mybatis Plus 自動填充字段,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03
Mybatis插入時返回自增主鍵方式(selectKey和useGeneratedKeys)
這篇文章主要介紹了Mybatis插入時返回自增主鍵方式(selectKey和useGeneratedKeys),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
springmvc+ajax+formdata上傳圖片代碼實例
這篇文章主要介紹了springmvc+ajax+formdata上傳圖片代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-09-09

