careercup 鍊錶 2 3

2021-09-06 20:00:27 字數 1336 閱讀 3233

2.3實現乙個演算法,刪除單向鍊錶中間的某個結點,假設你只能訪問該結點。(即你不知道頭結點)

這個問題的關鍵是你只有乙個指向要刪除結點的指標,如果直接刪除它,這條鍊錶就斷了。 但你又沒辦法得到該結點之前結點的指標,是的,它連頭結點也不提供。在這種情況下, 你只能另覓他徑。重新審視一下這個問題,我們只能獲得從c結點開始後的指標, 如果讓你刪除c結點後的某個結點,那肯定是沒問題的。比如刪除結點d,那只需要把c 的next指標指向e,然後delete d就ok了。好的,如果我們就刪除結點d,我們將得到 a->b->c->e,和目標鍊錶只差了乙個結點。怎麼辦呢?把d的資料給c! 結點結構都是一樣的,刪除誰都一樣,最關鍵的是結點中的資料,只要我們留下的是資料 a->b->d->e就ok了

思路已經有了,直接寫**?等等,寫**之前,讓我們再簡單分析一 下可能出現的各種情況(當然包括邊界情況)。如果c指向鍊錶的:1.頭結點;2.中間結點。 3.尾結點。4.為空。情況1,2屬於正常情況,直接將d的資料給c,c的next指標指向d 的next指向所指結點,刪除d就ok。情況4為空,直接返回。情況3比較特殊,如果c 指向尾結點,一般會認為直接刪除c就ok了,反正c後面也沒有結點了,不用擔心鍊錶斷開。 可是真的是這樣嗎?**告訴我們,直接刪除c,指向c的那個結點(比如說b)的next指標 並不會為空。也就是說,如果你列印這個鍊錶,它還是會列印出和原來鍊錶長度一樣的鍊錶, 而且最後乙個元素為0

關於這一點,原書ctci中是這麼講的,這正是面試官希望你指出來的。然後, 你可以做一些特殊處理,比如當c是尾結點時,將它的資料設定為一些特殊字元, 這樣在列印時就可以不列印它。當然也可以直接不處理這種情況,原書裡的**就是這麼做 的。這裡,也直接不處理這種情況。
c++實現**:

#include#include

using

namespace

std;

struct

listnode

};void createlist(listnode *&l)

;

inti;

listnode *p=null;

for(i=0; i<10; i++)

else

}}void deletenode(listnode *c)

intmain()

cout

next->next->next);

p=head;

while

(p)

cout

<}

careercup 鍊錶 2 1

2.1 編寫 移除未排序鍊錶中的重複節點。不使用臨時快取 如果不允許使用臨時的快取 即不能使用額外的儲存空間 那需要兩個指標,當第乙個指標指向某個元素時,第二個指標把該元素後面與它相同的元素刪除,時間複雜度o n2 c 實現 include include using namespace std s...

careercup 鍊錶 2 5

2.5 給定兩個用鍊錶表示的整數,每個結點包含乙個數字。這些數字是反向存放的,也就是個位排在鍊錶首部。編寫函式對這兩個整數求和,並用鍊錶形式返回結果。示例 輸入 7 1 6 5 9 2 即617 295.輸出 2 1 9,即912.高階 假設這些數字是正向存放的 示例 輸入 6 1 7 2 9 5 ...

careercup 鍊錶 2 7

2.7 編寫乙個函式,檢查鍊錶是否為回文。思路 1 可以利用鍊錶中的元素採用頭插法建立乙個新的鍊錶,然後比較兩個鍊錶的元素是否相等。2 利用快慢指標,將鍊錶後半部分逆轉之後,比較前半部分與後半部分是否相等。3 利用棧將鍊錶中的元素儲存,然後彈出與鍊錶中元素比較。c 實現 include includ...