【題目描述】
Implement an algorithm to delete a node in the middle of a singly linked list, given only access to that node.
給定一個單鏈表中的一個等待被刪除的節點(非表頭或表尾)。請在在O(1)時間復雜度刪除該鏈表節點。
【題目鏈接】
www.lintcode.com/en/problem/delete-node-in-the-middle-of-singly-linked-list/
【題目解析】
一般單鏈表刪除某個節點,需要知道刪除節點的前一個節點,則需要O(n)的遍歷時間,顯然常規思路是不行的。
在仔細看題目,換一種思路,既然不能在O(1)得到刪除節點的前一個元素,但我們可以輕松得到后一個元素,這樣,我們何不把后一個元素賦值給待刪除節點,這樣也就相當于是刪除了當前元素。可見,該方法可行。
但如果待刪除節點為最后一個節點,則不能按照以上思路。沒有辦法,只能按照常規方法遍歷,時間復雜度為O(n),是不是不符合題目要求呢?可能很多人在這就會懷疑自己的思考,從而放棄這種思路,最后可能放棄這道題,這就是這道面試題有意思的地方,雖看簡單,但是考察了大家的分析判斷能力,是否擁有強大的心理,充分自信。
其實我們分析一下,仍然是滿足題目要求的,如果刪除節點為前面的n-1個節點,則時間復雜度為O(1),只有刪除節點為最后一個時,時間復雜度才為O(n),所以平均的時間復雜度為:(O(1) * (n-1) + O(n))/n = O(1);仍然為O(1).
【參考答案】
www.jiuzhang.com/solutions/delete-node-in-the-middle-of-singly-linked-list/