日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Leetcode】大神总结的链表常见面试问题

發(fā)布時(shí)間:2025/3/15 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Leetcode】大神总结的链表常见面试问题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

無法高效獲取長度,無法根據(jù)偏移快速訪問元素,是鏈表的兩個(gè)劣勢。然而面試的時(shí)候經(jīng)常碰見諸如獲取倒數(shù)第k個(gè)元素,獲取中間位置的元素,判斷鏈表是否存在環(huán),判斷環(huán)的長度等和長度與位置有關(guān)的問題。這些問題都可以通過靈活運(yùn)用雙指針來解決。

Tips:雙指針并不是固定的公式,而是一種思維方式~

先來看"倒數(shù)第k個(gè)元素的問題"。設(shè)有兩個(gè)指針 p 和 q,初始時(shí)均指向頭結(jié)點(diǎn)。首先,先讓 p 沿著 next 移動(dòng) k 次。此時(shí),p 指向第 k+1個(gè)結(jié)點(diǎn),q 指向頭節(jié)點(diǎn),兩個(gè)指針的距離為 k 。然后,同時(shí)移動(dòng) p 和 q,直到 p 指向空,此時(shí) q 即指向倒數(shù)第 k 個(gè)結(jié)點(diǎn)。可以參考下圖來理解:

class Solution { public:ListNode* getKthFromEnd(ListNode* head, int k) {ListNode *p = head, *q = head; //初始化while(k--) { //將 p指針移動(dòng) k 次p = p->next;}while(p != nullptr) {//同時(shí)移動(dòng),直到 p == nullptrp = p->next;q = q->next;}return q;} };

獲取中間元素的問題。設(shè)有兩個(gè)指針 fast 和 slow,初始時(shí)指向頭節(jié)點(diǎn)。每次移動(dòng)時(shí),fast向后走兩次,slow向后走一次,直到 fast 無法向后走兩次。這使得在每輪移動(dòng)之后。fast 和 slow 的距離就會增加一。設(shè)鏈表有 n 個(gè)元素,那么最多移動(dòng) n/2 輪。當(dāng) n 為奇數(shù)時(shí),slow 恰好指向中間結(jié)點(diǎn),當(dāng) n 為 偶數(shù)時(shí),slow 恰好指向中間兩個(gè)結(jié)點(diǎn)的靠前一個(gè)(可以考慮下如何使其指向后一個(gè)結(jié)點(diǎn)呢?

下述代碼實(shí)現(xiàn)了 n 為偶數(shù)時(shí)慢指針指向靠后結(jié)點(diǎn)。

class Solution { public:ListNode* middleNode(ListNode* head) {ListNode *p = head, *q = head;while(q != nullptr && q->next != nullptr) {p = p->next;q = q->next->next;}return p;} };

是否存在環(huán)的問題。如果將尾結(jié)點(diǎn)的 next 指針指向其他任意一個(gè)結(jié)點(diǎn),那么鏈表就存在了一個(gè)環(huán)。

上一部分中,總結(jié)快慢指針的特性 —— 每輪移動(dòng)之后兩者的距離會加一。下面會繼續(xù)用該特性解決環(huán)的問題。
當(dāng)一個(gè)鏈表有環(huán)時(shí),快慢指針都會陷入環(huán)中進(jìn)行無限次移動(dòng),然后變成了追及問題。想象一下在操場跑步的場景,只要一直跑下去,快的總會追上慢的。當(dāng)兩個(gè)指針都進(jìn)入環(huán)后,每輪移動(dòng)使得慢指針到快指針的距離增加一,同時(shí)快指針到慢指針的距離也減少一,只要一直移動(dòng)下去,快指針總會追上慢指針。

根據(jù)上述表述得出,如果一個(gè)鏈表存在環(huán),那么快慢指針必然會相遇。實(shí)現(xiàn)代碼如下:

class Solution { public:bool hasCycle(ListNode *head) {ListNode *slow = head;ListNode *fast = head;while(fast != nullptr) {fast = fast->next;if(fast != nullptr) {fast = fast->next;}if(fast == slow) {return true;}slow = slow->next;}return nullptr;} };

最后一個(gè)問題,如果存在環(huán),如何判斷環(huán)的長度呢?方法是,快慢指針相遇后繼續(xù)移動(dòng),直到第二次相遇。兩次相遇間的移動(dòng)次數(shù)即為環(huán)的長度。

作者:Time-Limit
鏈接:https://leetcode-cn.com/problems/linked-list-cycle/solution/yi-wen-gao-ding-chang-jian-de-lian-biao-wen-ti-h-2/
來源:力扣(LeetCode)

猜你喜歡:👇🏻
?【Leetcode】Python 代碼本地構(gòu)造二叉樹、鏈表
?【Leetcode】創(chuàng)建鏈表
?【Leetcode】二叉樹展開為列表(遞歸思想)

總結(jié)

以上是生活随笔為你收集整理的【Leetcode】大神总结的链表常见面试问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。