zoukankan      html  css  js  c++  java
  • 删除链表节点代码编写复盘(从直接思路到优雅思路)

    直觉思路编码有bug

    func removeElements(head *ListNode, val int) *ListNode {
        // var pre *ListNode 
        // 1->2 1 // 1->1 1
        // head to be deleted
        for head != nil && head.Val == val {
            head = head.Next
        }
        cur := head
        for cur != nil && cur.Next != nil {
            if cur.Next.Val == val {
                cur.Next = cur.Next.Next
            }
            cur = cur.Next
        }
        return head
    }
    // 执行结果:
    输入:
    [1,2,2,1]
    2
    输出:
    [1,2,1]
    预期:
    [1,1]
    

    直觉思路编码fix bug

    func removeElements(head *ListNode, val int) *ListNode {
        // var pre *ListNode 
        // 1->2 1 // 1->1 1
        // head to be deleted
        for head != nil && head.Val == val {
            head = head.Next
        }
        cur := head
        for cur != nil && cur.Next != nil {
            if cur.Next.Val == val {
                cur.Next = cur.Next.Next
                continue  // fix bug
            }
            cur = cur.Next
        }
        return head
    }
    
    • 可以学到3点
    1. cur指向删除。丢失前面的节点 => 找到被删除节点前一个,就可以删除。
    2. 头节点没有上一个节点,所以单独处理。
    3. 特殊测试用例 【1,2a,2b,1】 2b的前一个节点是2a,但是cur指针没有机会移动到2a,2a就被删除了。 // fix bug。

    直觉思路编码优雅fix bug

    func removeElements(head *ListNode, val int) *ListNode {
        // var pre *ListNode 
        // 1->2 1 // 1->1 1
        // head to be deleted
        for head != nil && head.Val == val {
            head = head.Next
        }
        cur := head
        for cur != nil && cur.Next != nil {
            if cur.Next.Val == val {
                cur.Next = cur.Next.Next 
            }else{ // fix bug by adding else
                cur = cur.Next
    }
            
        }
        return head
    }
    

    // 速记

    1. 虚拟节点统一头节点和中间节点处理逻辑
    2. 找到删除节点上一个节点就可以删除了。 // 每次查看next节点是不是要删除节点。// 引入dummyhead,头节点就成为next节点。

    借鉴最优雅方案

    func removeElements(head *ListNode, val int) *ListNode {
        if head == nil{
            return nil
        }
        // 给链表扩展一个虚拟头节点
        dummy := &ListNode{Next:head}
        // 遍历链表,判断下一个节点是否是被删除节点
        cur := dummy
        for cur.Next != nil{
            if cur.Next.Val == val{
                cur.Next = cur.Next.Next
            }else{
                cur = cur.Next
            }
        }
        return dummy.Next
    }
    
  • 相关阅读:
    973. K Closest Points to Origin
    919. Complete Binary Tree Inserter
    993. Cousins in Binary Tree
    20. Valid Parentheses
    141. Linked List Cycle
    912. Sort an Array
    各种排序方法总结
    509. Fibonacci Number
    374. Guess Number Higher or Lower
    238. Product of Array Except Self java solutions
  • 原文地址:https://www.cnblogs.com/yudidi/p/12588143.html
Copyright © 2011-2022 走看看