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
    }
    
  • 相关阅读:
    55. 跳跃游戏
    45. 跳跃游戏 II
    对称的二叉树
    字符型图片验证码,使用tensorflow实现卷积神经网络,进行验证码识别CNN
    python版本升级及pip部署方法
    Two Sum [easy] (Python)
    工作中常用的linux命令(持续更新)
    PAT-1001. 害死人不偿命的(3n+1)猜想 (15)
    C++二维数组的动态声明
    19. Remove Nth Node From End of List(C++,Python)
  • 原文地址:https://www.cnblogs.com/yudidi/p/12588143.html
Copyright © 2011-2022 走看看