??前面的話??
大家好!博主開辟了一個新的專欄——劍指offer,我要開始刷題了!這個專欄會介紹《劍指offer》書上所有的面試編程題,并且會分享一些我的刷題心得,由于博主水平有限,如有錯誤,歡迎指正,如果有更好的解題思路和演算法可以分享給博主哦!一起加油!一起努力!
📒博客主頁:未見花聞的博客主頁
🎉歡迎關注🔎點贊👍收藏??留言📝
📌本文由未見花聞原創,CSDN首發!
📆首發時間:🌴2021年9月6日🌴
??堅持和努力一定能換來詩與遠方!
💭參考書籍:📚《劍指offer第1版》,📚《劍指offer第2版》
💬參考在線編程網站:🌐牛客網🌐力扣
🙏作者水平很有限,如果發現錯誤,一定要及時告知作者哦!感謝感謝!
博主的碼云gitee,平常博主寫的程式代碼都在里面,
📌導航小助手📌
- ??劍指 Offer 18. 洗掉鏈表的節點??
- 🔐題目詳情
- 💡解題思路
- 🔑源代碼
- 🌱總結
??劍指 Offer 18. 洗掉鏈表的節點??
🔐題目詳情
給定單向鏈表的頭指標和一個要洗掉的節點的值,定義一個函式洗掉該節點,
回傳洗掉后的鏈表的頭節點,
注意:此題對比原題有改動
示例:
輸入: head = [4,5,1,9], val = 5
輸出: [4,1,9]
解釋: 給定你鏈表中值為 5 的第二個節點,那么在呼叫了你的函式之后,該鏈表應變為 4 -> 1 -> 9.
輸入: head = [4,5,1,9], val = 1
輸出: [4,5,9]
解釋: 給定你鏈表中值為 1 的第三個節點,那么在呼叫了你的函式之后,該鏈表應變為 4 -> 5 -> 9.
限制:
題目保證鏈表中節點的值互不相同
若使用 C 或 C++ 語言,你不需要 free 或 delete 被洗掉的節點
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/shan-chu-lian-biao-de-jie-dian-lcof
💡解題思路
方法: 雙指標,
使用雙指標的方法,這道題可以分為兩種情況,第一種情況,當鏈表第一個元素就是需要洗掉的元素時,直接將頭結點洗掉,第二種情況,當鏈表的第一個元素不是需要洗掉的元素時,定義結點cur,用來比較其對應的值是否與需要洗掉的值val相等(這道題不會出現重復元素),另一個結點prev用來儲存cur的上一個結點,如果cur->val == val,就將cur的前一個結點的next指向cur結點的next,以洗掉cur結點,

時間復雜度: O(N)
空間復雜度: O(1)
🔑源代碼
編程語言:C語言
在線編程平臺:力扣
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* deleteNode(struct ListNode* head, int val){
if (head == NULL)
return NULL;
struct ListNode* cur = head;
struct ListNode* prev = head;
if (head->val == val)
{
head = head->next;
return head;//需要洗掉的結點為鏈表第一個元素
}
while (cur)
{
if (cur->val == val)
{
prev->next = cur->next;
break;//需要洗掉的結點不為鏈表第一個元素
}
prev = cur;
cur = cur->next;
}
return head;
}
🌱總結
對與無重復元素鏈表元素的洗掉,可以分情況采用雙指標的方法洗掉目標結點,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/298373.html
標籤:其他
