單鏈表之面試常考的幾道題

2021-10-20 14:12:54 字數 2084 閱讀 6233

文章目錄

1、單鏈表刪除倒數第k個節點

1.1、題目詳解

1.2、暴力解法

1.3、快慢指標法

2、鍊錶反轉

2.1、題目詳解

2.2、解題方法

3、總結

該題目在leetcode上面有,題號是鍊錶的19題,(題目鏈結)題目的描述我就用leetcode上面的來說啦!大家請看下面這張圖

其實解決這道題目呢,你可以來個暴力法哈!首先,你可以先遍歷一遍鍊錶,求得鍊錶的長度啦!既然鍊錶的長度你都知道了,那麼接下來那不就是和玩沒啥兩樣嘛!至於實現過程這裡我就不寫了,借鑑leetcode官方的解題答案,我們一起看看哈!

int getlength(struct listnode* head) 

return length;

}struct listnode* removenthfromend(struct listnode* head, int n)

cur->next = cur->next->next;

struct listnode* ans = dummy->next;

free(dummy);

return ans;

}

我們分析一下時間複雜度和空間複雜度哈!時間複雜度主要在遍歷鍊錶的時候花費的時間比較多,所以這裡是o(n),至於空間複雜度,不用想哈!那就是o(1) ,為什麼是1呢,因為我們這裡只用到了1個輔助空間哈!

所謂的快慢指標法,又叫做雙指標法,就一乙個指標在前面跑,另乙個指標在後面跑,只是後面那個指標起步是比較晚的;算啦,自己懶得畫圖啦,盜用一下官方的圖圖吧!

具體的實現**我這裡僅僅提供函式的實現部分,若是想看全部的原始碼檔案,(原始碼鏈結)

node *removenode(node *l, int location)

while(first) //判斷快指標是否為空

pre->next = second->next;

free(second);

return me;

}

//刪除單鏈表中倒數第n個節點(利用雙指標--快慢指標)

void deletespecialnode(linklist *l, int n)

while(fast_ptr->next != null)

me->next = slow_ptr->next;

free(slow_ptr);

}

鍊錶反轉的問題,就是將鍊錶每個節點的指向顛倒過來!就像下面圖所示的這個樣子!

看懂了吧!最簡單的方法當然是新建乙個鍊錶,然後採用頭插法,這個就得到了原鍊錶的逆序啦!這個過程我就不貼**啦!自己下去動手寫哈!而我要講的方法是使用雙指標的方法,來將鍊錶就地逆置,這個過程菜哥用ipad畫了個圖圖給大家看!(畫的圖有點醜,大家見諒哈!)

其實看懂這張圖,你就理解了這個是怎麼實現原地反轉的啦!接下來就是貼**環節啦!

//單鏈表反轉(原地逆置)

status revserselinklist(linklist *l)

(*l)->next = me;

return ok;

}

好啦,這題就講到這裡啦,其實還有很多的解法,大家可以去找找資料,學習一下哈! 

這道題呢,總體上的難度處於中等水準,可能第一種求解方法大家比較容易想到,第二種方法可能了解過快慢指標的小夥伴才會想到吧!最近菜哥會分享一些leetcode上面的一些題目的解法,為啥要分享呢,因為菜哥正處於求職階段,所以刷刷題,練一下基本功哈!

關於單鏈表的幾道題

思路 建立三個工作指標p,q,r,然後p遍歷整個鍊錶,p每到乙個結點,q就從這個結點往後遍歷,並與p的數值比較,相同的話就free掉那個結點.刪除單鏈表中重複結點的演算法 linklist removedupnode linklist l else q q next p p next return ...

面試常考的幾個題

管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。有名管道 named pipe 有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。訊號量 semophore 訊號量是乙個計數器,可以用來控制多個程序對...

PHP面試常考內容之物件導向(1)

php中物件導向常考的知識點有以下幾點,我將會從以下幾點進行詳細介紹說明,幫助你更好的應對php面試常考的物件導向相關的知識點和考題。一 物件導向與面向過程有什麼區別?二 物件導向有什麼特徵?三 什麼是建構函式和析構函式?四 物件導向的作用域範圍有哪幾種?五 php 中魔術方法有哪些?六 什麼是物件...