谷歌面試題:如何從無序鏈表中移除重復(fù)項(xiàng)宪肖?

一位小伙伴來問一道谷歌的筆試題表制,關(guān)于單鏈表操作的健爬,問到底有多少種解決方案,今天我們就來聊聊么介。

題目的大致意思是:

假設(shè)存在一個(gè)無序單鏈表娜遵,將重復(fù)結(jié)點(diǎn)去除后,并保原順序壤短。去重前:1→3→1→5→5→7去重后:1→3→5→7

順序刪除

通過雙重循環(huán)直接在鏈表上執(zhí)行刪除操作设拟。外層循環(huán)用一個(gè)指針從第一個(gè)結(jié)點(diǎn)開始遍歷整個(gè)鏈表,然后內(nèi)層循環(huán)用另外一個(gè)指針遍歷其余結(jié)點(diǎn)久脯,將與外層循環(huán)遍歷到的指針?biāo)附Y(jié)點(diǎn)的數(shù)據(jù)域相同的結(jié)點(diǎn)刪除纳胧,如下圖所示。

假設(shè)外層循環(huán)從outerCur開始遍歷帘撰,當(dāng)內(nèi)層循環(huán)指針innerCur遍歷到上圖實(shí)線所示的位置(outerCur.data==innerCur.data)時(shí)跑慕,此時(shí)需要把innerCur指向的結(jié)點(diǎn)刪除。

具體步驟如下:

  • 用tmp記錄待刪除的結(jié)點(diǎn)的地址摧找。
  • 為了能夠在刪除tmp結(jié)點(diǎn)后繼續(xù)遍歷鏈表中其余的結(jié)點(diǎn)核行,使innerCur指針指向它的后繼結(jié)點(diǎn):innerCur=innerCur.next。
  • 從鏈表中刪除tmp結(jié)點(diǎn)蹬耘。

實(shí)現(xiàn)代碼如下:

[圖片上傳失敗...(image-327f7f-1614062950016)]

[圖片上傳失敗...(image-9c0473-1614062950016)]

[圖片上傳失敗...(image-465005-1614062950016)]

運(yùn)行結(jié)果:

[圖片上傳失敗...(image-3c179c-1614062950016)]

算法性能分析

由于這種方法采用雙重循環(huán)對(duì)鏈表進(jìn)行遍歷芝雪,因此,時(shí)間復(fù)雜度為O(N^2)综苔。其中绵脯,N為鏈表的長度。在遍歷鏈表的過程中休里,使用了常量個(gè)額外的指針變量來保存當(dāng)前遍歷的結(jié)點(diǎn)蛆挫、前驅(qū)結(jié)點(diǎn)和被刪除的結(jié)點(diǎn),因此妙黍,空間復(fù)雜度為O(1)悴侵。

遞歸法

主要思路為:對(duì)于結(jié)點(diǎn)cur,首先遞歸地刪除以cur.next為首的子鏈表中重復(fù)的結(jié)點(diǎn)拭嫁,接著從以cur.next為首的子鏈表中找出與cur有著相同數(shù)據(jù)域的結(jié)點(diǎn)并刪除可免。

實(shí)現(xiàn)代碼如下:

[圖片上傳失敗...(image-ff77ce-1614062950016)]

[圖片上傳失敗...(image-6eb908-1614062950016)]

[圖片上傳失敗...(image-ba82a3-1614062950016)]

算法性能分析

這種方法與方法一類似,從本質(zhì)上而言做粤,由于這種方法需要對(duì)鏈表進(jìn)行雙重遍歷浇借,因此,時(shí)間復(fù)雜度為O(N^2)怕品。其中妇垢,N為鏈表的長度。由于遞歸法會(huì)增加許多額外的函數(shù)調(diào)用,因此闯估,從理論上講灼舍,該方法效率比前面的方法低。

空間換時(shí)間

通常情況下涨薪,為了降低時(shí)間復(fù)雜度骑素,往往在條件允許的情況下,通過使用輔助空間實(shí)現(xiàn)刚夺。

具體而言献丑,主要思路如下盾戴。

  • 建立一個(gè)HashSet盅视,HashSet中的內(nèi)容為已經(jīng)遍歷過的結(jié)點(diǎn)內(nèi)容,并將其初始化為空含懊。
  • 從頭開始遍歷鏈表中的<typo id="typo-936" data-origin="所以" ignoretag="true">所以</typo>結(jié)點(diǎn)结借,存在以下兩種可能性:
  • 如果結(jié)點(diǎn)內(nèi)容已經(jīng)在HashSet中,則刪除此結(jié)點(diǎn)卒茬,繼續(xù)向后遍歷船老。
  • 如果結(jié)點(diǎn)內(nèi)容不在HashSet中,則保留此結(jié)點(diǎn)圃酵,將此結(jié)點(diǎn)內(nèi)容添加到HashSet中柳畔,繼續(xù)向后遍歷。

「引申:如何從有序鏈表中移除重復(fù)項(xiàng)郭赐?」

如鏈表:1,3薪韩、5、5捌锭、7俘陷、7、8观谦、9

去重后:1,3拉盾、5、7豁状、8捉偏、9

分析與解答

上述介紹的方法也適用于鏈表有序的情況,但是由于以上方法沒有充分利用到鏈表有序這個(gè)條件泻红,因此夭禽,算法的性能肯定不是最優(yōu)的。本題中谊路,由于鏈表具有有序性讹躯,因此,不需要對(duì)鏈表進(jìn)行兩次遍歷。所以蜀撑,有如下思路:用cur 指向鏈表第一個(gè)結(jié)點(diǎn)挤巡,此時(shí)需要分為以下兩種情況討論。

  • 如果cur.data==cur.next.data酷麦,那么刪除cur.next結(jié)點(diǎn)矿卑。
  • 如果cur.data!=cur.next.data,那么cur=cur.next沃饶,繼續(xù)遍歷其余結(jié)點(diǎn)母廷。

總結(jié)

對(duì)于無序單鏈表中,想要?jiǎng)h除其中重復(fù)的結(jié)點(diǎn)(多個(gè)重復(fù)結(jié)點(diǎn)保留一個(gè))糊肤。刪除辦法有按照順序刪除琴昆、使用遞歸方式刪除以及可以使用空間換時(shí)間(HashSet中元素的唯一性)。

點(diǎn)贊越多馆揉,bug越少~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末业舍,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子升酣,更是在濱河造成了極大的恐慌舷暮,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件噩茄,死亡現(xiàn)場(chǎng)離奇詭異下面,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)绩聘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門沥割,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凿菩,你說我怎么就攤上這事机杜。” “怎么了衅谷?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵叉庐,是天一觀的道長。 經(jīng)常有香客問我会喝,道長陡叠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任肢执,我火速辦了婚禮枉阵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘预茄。我一直安慰自己兴溜,他們只是感情好侦厚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拙徽,像睡著了一般刨沦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上膘怕,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天想诅,我揣著相機(jī)與錄音,去河邊找鬼岛心。 笑死来破,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的忘古。 我是一名探鬼主播徘禁,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼髓堪!你這毒婦竟也來了送朱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤干旁,失蹤者是張志新(化名)和其女友劉穎驶沼,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疤孕,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年央拖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了祭阀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鲜戒,死狀恐怖专控,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情遏餐,我是刑警寧澤伦腐,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站失都,受9級(jí)特大地震影響柏蘑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜粹庞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一咳焚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧庞溜,春花似錦革半、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽延刘。三九已至,卻和暖如春六敬,著一層夾襖步出監(jiān)牢的瞬間碘赖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國打工觉阅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留崖疤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓典勇,卻偏偏與公主長得像劫哼,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子割笙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容