美文网首页
剑指 Offer II 021. 删除链表的倒数第 n 个结点

剑指 Offer II 021. 删除链表的倒数第 n 个结点

作者: 邦_ | 来源:发表于2022-04-20 09:38 被阅读0次

    最直接的思路 求出来长度 在特殊处理下只有一个元素 和要删除的元素和长度相等的情况


    截屏2022-04-13 下午7.09.21.png

    看着还行的样子。。

    
    func removeNthFromEnd(_ head: ListNode?, _ n: Int) -> ListNode? {
    
            var count = 0
            var tempHead = head
            let endHead = head
    
            while tempHead != nil {
                
                count += 1
                tempHead = tempHead?.next
            }
             if count == 1 {
                return nil
            }
            if count == n  {
                return head?.next
            }
    
            var dHead = endHead
            
            for i in 0..<count{
                
                if i == ( count - 1 - n ){
                    dHead?.next = dHead?.next?.next
                    break
                }
                dHead = dHead?.next
            }
            return endHead
        }
    

    双指针。,。 既然是倒数的 那么一开始的时候。两个指针都指向起始位置
    然后指针之间的间隔是2的话。一起移动指针 那么当右边的指针走到最右边的时候 左边的指针就是倒数第2个节点
    就可以不用管总长度了。。

    func removeNthFromEnd(_ head: ListNode?, _ n: Int) -> ListNode? {
            
            
            var tempHead = head
            let endHead = head
            var right = 0
            
            var dHead = endHead
    
            while tempHead != nil {
                
                if right >= n + 1 {
    
                    dHead = dHead?.next
                }
                tempHead = tempHead?.next
                right += 1
    
            }
            //说明移除的是第一个
            if right == n {
                
                return head?.next
            }
            
            if right == 1 {
                
                return nil
            }
            
            dHead?.next = dHead?.next?.next
    
            return endHead
            
        }
    
    

    然后使用虚拟头 解决要删除的是头结点的情况

        func removeNthFromEnd(_ head: ListNode?, _ n: Int) -> ListNode? {
            
            if head == nil {
                return head
            }
            
            var fast = head
            var slow: ListNode? = ListNode(-1, head)
            let h = slow
            var right = 0
            
            while fast != nil {
                   
                   if right >= n   {
    
                       slow = slow?.next
                   }
                   fast = fast?.next
                   right += 1
               }
            
            
            slow?.next = slow?.next?.next
            
            return h?.next
    
           
            
        }
    
    
    
    
    
    

    相关文章

      网友评论

          本文标题:剑指 Offer II 021. 删除链表的倒数第 n 个结点

          本文链接:https://www.haomeiwen.com/subject/wlwosrtx.html