leetCode 237. Delete Node in a Linked List

    題目鏈接:https://leetcode.com/problems/delete-node-in-a-linked-list/

    題目內容:

Write a function to delete a node (except the tail) in a singly linked list, given only access to that node.

Supposed the linked list is 1 -> 2 -> 3 -> 4 and you are given the third node with value 3, the linked list should become 1 -> 2 -> 4 after calling your function.

    題目分析:

    題目大意是給定一個單向鏈表(強調了是單向),給定鏈表中的一個節點,要求從鏈表中刪除這個節點。如果沒記錯的話,以前刪除鏈表中的節點使用的是O(n)的暴力解法:遍歷鏈表,比較節點中的value值,找到後將該節點的前一個節點的next指針指向該刪除節點的next,delete之,再將其賦值爲NULL(一氣呵成,perfect)。不過這是O(n)的解法,而且在本題中,訪問該鏈表的入口時改刪除的節點,不用你找,但是找不到該節點的前一個節點,無法將其指向刪除節點的next(單向鏈表)。思考良久之後突然有了想法,主要是從題目中得到的啓發,"爲什麼題目要強調刪除的節點不會是最後一個節點(except the tail)",我的思路如下:爲什麼一定要刪除該節點node,既然找不到刪除節點node的上一個節點,只要把下一節點的屬性全都賦給刪除節點node,然後後面的節點一個一個往上覆蓋,最後一個節點丟棄,perfect!(多傻多天真^o^)這種解法是可以的,運行效率也不會差到哪裏去,提交至,AC,主要要考慮邊界問題,比如最後一個節點丟棄時候的操作,由於已經優化,原來的代碼找不到了,也不想再寫一遍丟碾。

    優化是醬紫的:事實上,上面解法沒必要把node節點以後的節點一個一個往上游覆蓋,只需將node的下一個節點nnode的val和next覆蓋到node之後,將nnode刪掉並賦爲空就可以了,後面的鏈表結構完全不用改動。這就是後來的解法:

void deleteNode(ListNode* node) {
    ListNode *del = node->next;
    node->val = node->next->val;
    node->next= node->next->next;
    delete del;
    del = NULL;
}
    肯定是AC,而且效率的確提高了。但是看到討論區說有更好的,沒找到,找得到的是用其他語言實現,但是思路一樣,我就試一下用java來實現,提交之後發現耗時的確少了,至今不知道爲什麼。後面好幾次提交leetCode題目的時候用java版本代替C++代碼發現效率都有提升,leetCode心,海底針。

public void deleteNode(ListNode node) {
    ListNode del = node.next;
    node.val = del.val;
    node.next = del.next;
}


發佈了56 篇原創文章 · 獲贊 27 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章