title: 每日一練(10):刪除鍊錶的節點
categories:[劍指offer]
tags:[每日一練]
date: 2022/01/23
給定單向鍊錶的頭指標和乙個要刪除的節點的值,定義乙個函式刪除該節點。
返回刪除後的鍊錶的頭節點。
注意:此題對比原題有改動
示例 1:
輸入: head = [4,5,1,9], val = 5
輸出: [4,1,9]
解釋: 給定你鍊錶中值為 5 的第二個節點,那麼在呼叫了你的函式之後,該鍊錶應變為 4 -> 1 -> 9.
示例 2:
輸入: head = [4,5,1,9], val = 1
輸出: [4,5,9]
解釋: 給定你鍊錶中值為 1 的第三個節點,那麼在呼叫了你的函式之後,該鍊錶應變為 4 -> 5 -> 9.
說明:題目保證鍊錶中節點的值互不相同
若使用 c 或 c++ 語言,你不需要 free 或 delete 被刪除的節點
如果頭部的值是val直接返回頭的next即可,不是遍歷頭部,找到val後直接跳過該節點,並返回head即可
listnode* deletenode(listnode* head, int val)
listnode *node = head;
while (node->next != nullptr)
node = node->next;
}return head;
}
遞迴的方式就比較巧妙,可以理解從尾部到頭判斷,空則返回空,非空判斷是否等於val,等於返回其next,不等於則返回本身
//遞迴1
listnode* deletenode(listnode* head, int val)
head->next = deletenode(head->next, val);
if (head->val == val)
return head;
}//遞迴2
listnode* deletenode(listnode* head, int val)
head->next = deletenode(head->next, val);
//三目運算子
return head->val == val ? head->next : head;
}
設定兩個指標分別指向頭節點,pre (要刪除節點的前一節點)和 cur (當前節點);
遍歷整個鍊錶,查詢節點值為 val 的節點,找到了就刪除該節點,否則繼續查詢。
1.找到,將當前節點的前驅節點(pre 節點或者說是之前最近乙個值不等於 val 的節點)連線到當前節點(cur 節點)的下乙個節點(pre->next = cur->next)。
2.沒找到,繼續遍歷(cur = cur->next),更新最近乙個值不等於 val 的節點(pre = cur)。
listnode* deletenode(listnode* head, int val)
if(head->val == val)
listnode* cur = head; // 當前節點
listnode* pre = head; // 儲存刪除節點的前一節點
while (cur != null && cur->val != val)
if (cur != null)
return head;
}
每日一練(13) 反轉鍊錶
title 每日一練 13 反轉鍊錶 categories 劍指offer tags 每日一練 date 2022 01 26 定義乙個函式,輸入乙個鍊錶的頭節點,反轉該鍊錶並輸出反轉後鍊錶的頭節點。示例 輸入 1 2 3 4 5 null 輸出 5 4 3 2 1 null 限制 0 節點個數 5...
每日一練(12) 鍊錶中倒數第k個節點
title 每日一練 12 鍊錶中倒數第k個節點 categories 劍指offer tags 每日一練 date 2022 01 25 輸入乙個鍊錶,輸出該鍊錶中倒數第k個節點。為了符合大多數人的習慣,本題從1開始計數,即鍊錶的尾節點是倒數第1個節點。例如,乙個鍊錶有 6 個節點,從頭節點開始,...
每日一題,每日一練。8 鍊錶的中間結點
給定乙個帶有頭結點 head 的非空單鏈表,返回鍊錶的中間結點。如果有兩個中間結點,則返回第二個中間結點 示例 1 輸入 1,2,3,4,5 輸出 此列表中的結點 3 序列化形式 3,4,5 返回的結點值為 3 測評系統對該結點序列化表述是 3,4,5 注意,我們返回了乙個 listnode 型別的...