題目描述:
有兩串鍊錶表示為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 的時間複雜度刪除該結點。解決方法為將待刪除結點的後繼結點的值 賦...