每日一練(10) 刪除鍊錶的節點

2022-09-19 11:24:13 字數 1772 閱讀 5278

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 型別的...