刪除鍊錶A中與鍊錶B結點相同的結點

2021-07-22 10:33:21 字數 1879 閱讀 4689

題目描述:

有兩串鍊錶表示為a和b,刪除鍊錶a中的結點,滿足刪除條件的結點是該結點與鍊錶b中某結點的值相同。

**如下:

# include 

using

namespace

std;

typedef

struct list

plist;

int deletenode(plist *, plist*);

void createlist(plist *, int, int);

void printlist(plist *);

int deletenode(plist **plisthead, plist *pdeletelisthead)

else

}pdeletenode = pdeletelisthead;

if (pnode == *plisthead && pnewhead == null && flag == true)

if (flag == false && pnewhead != null)

if (flag == false && pnewhead == null)

if (flag == true && pnewhead != null)

}return cnt;

}void createlist(plist *head, int a, int n)

}void printlist(plist *head)

cout

<< endl;

}int main(void)

; int deletenums[6] = ;

plist *plisthead = (plist *) malloc(sizeof(plist));

plist *pdeletelisthead = (plist *) malloc(sizeof(plist));

createlist(plisthead, nums, 15);

createlist(pdeletelisthead, deletenums, 6);

cout

<< "plist: ";

printlist(plisthead);

cout

<< "pdeletelist: ";

printlist(pdeletelisthead);

int cnt = deletenode(&plisthead, pdeletelisthead);

cout

<< "delete num is: ";

cout

<< cnt << endl;

cout

<< "after delete, plist is: ";

printlist(plisthead);

}

做法是定義兩層迴圈,第一層迴圈是迴圈a鍊錶,第二層迴圈是將a鍊錶的當前結點與b鍊錶的所有節點比較,若相同,則表明a鍊錶的當前結點是要刪除的,將flag標誌改寫為true,跳出迴圈,並將指向b鍊錶結點的指標指向b鍊錶的頭結點,然後處理a鍊錶中的要刪除的結點。

需要注意的是:

1. 穿入的引數必須是頭結點的二級指標,因為若頭結點被刪除,頭結點要向後移,若只是傳遞頭結點指標,若函式執行完畢,該後移的指標會釋放,導致主函式的頭結點指向未知記憶體。

2. 需要分別判斷該結點是否刪除。對於刪除和不刪除,又需要考慮兩個狀態,即當前結點是不是頭結點。所以,我們需要考慮四種情況。1.當前結點要刪除,是頭結點;2. 當前結點要刪除,不是頭結點;3. 當前結點不要刪除,是頭結點;4. 當前結點不要刪除, 不是頭結點。

執行結果為:

刪除鍊錶中的結點

1.題目描述 請編寫乙個函式,使其可以刪除某個鍊錶中給定的 非末尾 節點,你將只被給定要求被刪除的節點。現有乙個鍊錶 head 4,5,1,9 它可以表示為 示例 1 輸入 head 4,5,1,9 node 5輸出 4,1,9 解釋 給定你鍊錶中值為 5 的第二個節點,那麼在呼叫了你的函式之後,該...

刪除鍊錶中的結點

題目一 給你乙個鍊錶,刪除鍊錶的倒數第 n 個結點,並且返回鍊錶的頭結點。高階 你能嘗試使用一趟掃瞄實現嗎?示例 1 輸入 head 1,2,3,4,5 n 2 輸出 1,2,3,5 示例 2 輸入 head 1 n 1 輸出 示例 3 輸入 head 1,2 n 1 輸出 1 解法一 利用乙個佇列...

刪除鍊錶結點

劍指offer18題 刪除鍊錶的節點 題目描述 給定單向鍊錶的頭指標和乙個要刪除的節點的值,定義乙個函式刪除該節點。返回刪除後的鍊錶的頭節點。解題思路 該題在劍指offer中的原題是,給定乙個單鏈表的頭指標 指定結點指標,要求以o 1 的時間複雜度刪除該結點。解決方法為將待刪除結點的後繼結點的值 賦...