文章目錄
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 中魔術方法有哪些?六 什麼是物件...