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
    }
    
  • 相关阅读:
    window端口被占用
    webstorm中关闭烦人Eslint语法检查
    STM32 printf 函数原型
    Memset、Memcpy、Strcpy 的作用和区别(转)
    SMD贴片元件的封装尺寸(转)
    Windows Phone开发工具初体验(转载)
    Open Cell(转载)
    标题:常用贴片元件封装(转载)
    关于TV Dongle的功能设计和思考【图】(转载)
    图片预览加上传遇到的一系列问题
  • 原文地址:https://www.cnblogs.com/yudidi/p/12588143.html
Copyright © 2011-2022 走看看