不要糾結,幹就完事了,熟練度很重要!!!多練習,多總結!!!
將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。
示例:輸入:1->2->4, 1->3->4
輸出:1->1->2->3->4->4
關於鍊錶題目,我們要知道乙個小技巧,那就是關於哨兵節點的設定!因為很多時候我們需要返回的是鍊錶,這時候我們指定乙個哨兵節點指向操作後鍊錶的頭節點!這時候其他節點就可以後移進行其他操作,不用直接返回哨兵的next節點即可得到鍊錶!
回到本題,我們首先new乙個哨兵節點,還有乙個cur指標從哨兵節點出發,來記錄排序的各個節點,其次本題需要借助雙指標,分別指向兩個鍊錶的節點,每次我們對比兩個鍊錶相應指標指向元素的大小,將較小的節點加入cur,依次來進行排序!
class
solution
if(l2==
null
) listnode phead=
newlistnode(0
);listnode cur=phead;
while
(l1!=
null
&&l2!=
null
)else
cur=cur.next;}if
(l1==
null)if
(l2==
null
)return phead.next;
}}
給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。
示例:給定乙個鍊錶: 1->2->3->4->5, 和 n = 2.
當刪除了倒數第二個節點後,鍊錶變為 1->2->3->5.
說明:給定的 n 保證是有效的。
高階:你能嘗試使用一趟掃瞄實現嗎?
本題也是鍊錶比較經典的雙指標問題了!有乙個查詢倒數第n個節點,這題是刪除倒數第n個節點,那麼我們除了查詢到倒數第n個,還要找到其前面的乙個節點,然後直接p.next=p.next.next就把倒數第n個節點刪除了!
那麼很簡單,除了哨兵節點外,我們在定義兩個指標pre和cur,為了最後乙個指向倒數第n個的前乙個,乙個指向倒數第n個。初始化時pre指向哨兵節點,cur指向煉表頭節點,pre和cur整好相差乙個,這樣就可以查詢到前乙個節點了!然後鍊錶的頭節點head先向後移動n次,然後pre和cur與head同時移動,直到head指向null為止!這時cur就指向倒數第n個節點,而pre就是前乙個節點了!完成!
class
solution
listnode phead=
newlistnode(0
);phead.next=head;
listnode pre=phead;
listnode cur=head;
int k=1;
while
(k<=n)
while
(cur!=
null
&&head!=
null
) pre.next=pre.next.next;
return phead.next;
}}
給定乙個鍊錶,判斷鍊錶中是否有環。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置(索引從 0 開始)。如果 pos 是 -1,則在該鍊錶中沒有環。
鍊錶成環檢測,經典的快慢指標!除了哨兵節點的設定外,定義slow和fast兩個指標,每次slow移動一步,fast移動兩步,如果有環時,兩指標會相遇,即可返回true,相反,如果沒有環,那麼fast指標將率先遍歷到鍊錶末尾即null,那麼返回false。
public
class
solution
listnode slow=head;
listnode fast=head;
while
(fast!=
null
&&fast.next!=
null)}
if(slow!=fast)
return
false;}
}
給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
雖然是第2題,但是大廠也是考過的哦!
不多說,開講,設定乙個變數用來儲存每次相加的結果,同時還承擔乙個進製的功能。遍歷兩個鍊錶,只要有乙個鍊錶不為空或者進製不為0,那麼就繼續執行。每次我們新增的節點val值,等於鍊錶節點值(可能兩個鍊錶節點相加,也可能只是某個鍊錶的節點,因為沒說兩個鍊錶一定是等長的!)對10進行取餘運算,即為本位相加的結果,同時我們要記錄進製情況,進製就等於當前本位鍊錶加法對10進行整除結果!
class
solution
if(l2==
null
) listnode phead=
newlistnode(0
);listnode cur=phead;
int tmp=0;
while
(l1!=
null
||l2!=
null
||tmp!=0)
if(l2!=
null
) cur.next=
newlistnode
(tmp%10)
; tmp=tmp/10;
cur=cur.next;
}return phead.next;
}}
運用你所掌握的資料結構,設計和實現乙個 lru (最近最少使用) 快取機制。它應該支援以下操作:獲取資料 get 和 寫入資料 put 。
獲取資料 get(key) - 如果金鑰 (key) 存在於快取中,則獲取金鑰的值(總是正數),否則返回 -1。
寫入資料 put(key, value) - 如果金鑰不存在,則寫入其資料值。當快取容量達到上限時,它應該在寫入新資料之前刪除最近最少使用的資料值,從而為新的資料值留出空間。
高階:你是否可以在 o(1) 時間複雜度內完成這兩種操作?
示例:lrucache cache = new lrucache( 2 /* 快取容量 */ );
cache.put(1, 1);
cache.put(2, 2);
cache.get(1); // 返回 1
cache.put(3, 3); // 該操作會使得金鑰 2 作廢
cache.get(2); // 返回 -1 (未找到)
cache.put(4, 4); // 該操作會使得金鑰 1 作廢
cache.get(1); // 返回 -1 (未找到)
cache.get(3); // 返回 3
cache.get(4); // 返回 4
lru是乙個非常重要的演算法,底層類似linkedhashmap即hashmap+雙向鍊錶結構!在redis和作業系統中,設計快取淘汰演算法都能看到lru的影子!!!很重要!!!
public
class
lrucache
private
void
addnode
(linkednode node)
private
void
removenode
(linkednode node)
private
void
movetohead
(linkednode node)
private linkednode poptail()
private hashtable cache =
newhashtable
();private int size;
private int capacity;
private linkednode head, tail;
public
lrucache
(int capacity)
public int get
(int key)
public
void
put(int key, int value)
}else
}}
覺得本部落格有用的客官,可以給個點讚+收藏哦! 嘿嘿 mysql 雙向鍊錶 面試 雙向鍊錶
面試遇到乙個題目,寫乙個雙向鍊錶,包括新增,刪除,查詢和遍歷。當時寫了一塌糊塗,後來自己都覺得想笑,雙向寫著寫著被我寫成了單向不像單向,雙向不像雙向了,真是不倫不類。之後 我把這個問題整理了一下,希望對以後的小夥伴 有幫助。如果有錯誤,希望指出 以免誤人。謝謝!public class linkno...
LeetCode 鍊錶 面試題 反轉鍊錶
題目 於 leetcode 上第 206號 reverse linked list 問題 反轉乙個單鏈表。題目難度為 easy。題目描述 reverse a singly linked list.反轉乙個單鏈表 input 1 2 3 4 5 null output 5 4 3 2 1 null 複...
鍊錶及鏈表面試題
首先看一下順序表和煉表的優缺點,分別在什麼場景下使用?源 list.h ifndef list h define list h include include include typedef int datatype typedef struct node node,pnode,plist init...