题目描述:在 O(1) 时间内删除链表节点
import Foundation
class For13Solution {
func deleteNode(_ head: ListNode?,_ pDeleted: ListNode?) -> ListNode? {
var p = head
if p == nil || pDeleted == nil {
return p
}
if pDeleted?.next != nil {
//删除的不是尾节点
pDeleted?.val = (pDeleted?.next?.val)!
pDeleted?.next = pDeleted?.next?.next
}else if p === pDeleted {
//删除的是头结点,只有一个节点
p = nil
} else {
//删除的是尾节点
let s = p
while p?.next !== pDeleted {
p = p?.next
}
p?.next = nil
p = s
}
return p
}
}
算法思想:① 如果该节点不是尾节点,那么可以直接将下一个节点的值赋给该节点,然后令该节点指向下下个节点,再删除下一个节点,时间复杂度为 O(1)。
② 否则,就需要先遍历链表,找到节点的前一个节点,然后让前一个节点指向 null,时间复杂度为 O(N)。
github地址:https://github.com/cubegao/LeetCode