剑指offer—面试题18(一):删除链表的节点

给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。(此题对比原题有改动)

删除链表节点,首先就要想到单链表的特性,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
     }

你可能感兴趣的:(剑指offer—面试题18(一):删除链表的节点)