给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。(此题对比原题有改动)
删除链表节点,首先就要想到单链表的特性,next指针指向下一个节点,所以就考虑到双指针,一个指针寻找要删除的节点,一个指向前一个指针之前的节点,找到后可以将后一个指针的next 指向 前一个指针的next。代码自然而然就有如下:
func deleteNode(_ head: ListNode?, _ val: Int) -> ListNode? {
guard head != nil else {
return nil
}
if head!.val == val {
return head?.next
}
var fast = head?.next
var slow = head
while fast != nil {
if fast!.val == val {
slow?.next = fast?.next
return head
}else {
fast = fast?.next
slow = slow?.next
}
}
return nil
}
还有一种递归算法:
func deleteNode(_ head: ListNode?, _ val: Int) -> ListNode? {
guard head != nil else {
return nil
}
if head!.val == val {
return head?.next
}
head?.next = deleteNode(head?.next, val)
return head
}