• 【代码随想录】算法训练计划03


    1、203. 移除链表元素

    题目:
    给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
    输入:head = [1,2,6,3,4,5,6], val = 6
    输出:[1,2,3,4,5]
    在这里插入图片描述

    思路:
    • 移除链表元素,链表一定要注意虚拟头
    • 不要忘记不删除的时候要前移元素
    • 注意 cur 的赋值方式
    • 注意是初始化一个虚拟头节点,和声明分别开
    // 代码一刷——虚拟头
    func removeElements(head *ListNode, val int) *ListNode {
       dummy := &ListNode{}
       dummy.Next = head
       //cul.Next := head 这种写法错了
       cul := dummy
       for cul.Next != nil {
           if cul.Next.Val == val {
               cul.Next = cul.Next.Next
           } else { // 不要忘记前移
               cul = cul.Next
           }
       }
       return dummy.Next
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    2、707. 设计链表

    题目:
    题目太长了就不复制了

    思路:
    • 这题吧,主要两点
    • 1、注意条件说的是 index 是下标
    • 2、注意边界条件,-1 啥的
    // 代码一刷
    type SingleNode struct {
        Val int
        Next *SingleNode
    }
    
    type MyLinkedList struct {
        dummyHead *SingleNode
        Size int
    }
    
    
    func Constructor() MyLinkedList {
        newNode := &SingleNode{
            -99,
            nil,
        }
        return MyLinkedList{
            dummyHead: newNode,
            Size: 0,
        }
    }
    
    
    func (this *MyLinkedList) Get(index int) int {
        //获取链表中下标为 index 的节点的值。如果下标无效,则返回 -1 
        if this == nil || index < 0 || index >= this.Size {
            return -1
        }
        cur := this.dummyHead.Next
        for i:=0; i<index; i++ {
            cur = cur.Next
        }
        return cur.Val
    }
    
    
    func (this *MyLinkedList) AddAtHead(val int)  {
        newNode := &SingleNode{Val:val}
        newNode.Next = this.dummyHead.Next
        this.dummyHead.Next = newNode
        //return this.Next
        this.Size++
    }
    
    
    func (this *MyLinkedList) AddAtTail(val int)  {
        cur := this.dummyHead
        for cur.Next != nil {
            cur = cur.Next
        }
        newNode := &SingleNode{Val: val}
        cur.Next = newNode
        this.Size++
    }
    
    
    func (this *MyLinkedList) AddAtIndex(index int, val int)  {
        //
        if index < 0 {
            index = 0
        } else if index > this.Size {
            return
        }
        
        newNode := &SingleNode{Val:val}
        cur := this.dummyHead
        for i:=0; i<index; i++ {
            cur = cur.Next
        }
        newNode.Next = cur.Next
        cur.Next = newNode
        this.Size++
    }
    
    
    func (this *MyLinkedList) DeleteAtIndex(index int)  {
        if index < 0 || index >= this.Size {
            return
        }
        cur := this.dummyHead
        for i:=0; i<index; i++ {
            cur = cur.Next
        }
        if cur.Next != nil {
            cur.Next = cur.Next.Next
        }
        
        this.Size--
    }
    
    
    /**
     * Your MyLinkedList object will be instantiated and called as such:
     * obj := Constructor();
     * param_1 := obj.Get(index);
     * obj.AddAtHead(val);
     * obj.AddAtTail(val);
     * obj.AddAtIndex(index,val);
     * obj.DeleteAtIndex(index);
     */
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103

    3、206. 反转链表

    题目:
    给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
    输入:head = [1,2,3,4,5]
    输出:[5,4,3,2,1]

    思路:
    • 写老多遍了,这最少是第 7 遍,说说这次注意点吧
    • 1、注意声明两个变量,pre,cur
    • 2、注意 pre 声明,但是不初始化,因为不要 nil,看输入输出就知道了
    // 代码一刷——只需要声明一个 pre 即可,不需要初始化
    func reverseList(head *ListNode) *ListNode {
        var pre *ListNode
        cur := head
        for cur != nil {
            next := cur.Next
            cur.Next = pre
            pre = cur
            cur = next
        }
        return pre
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    软件测试13年从业经验的前辈,总结的5条测试就业建议....
    R语言条件判断语句编程:使用if else语句实现条件逻辑判断(if else condition)
    进程间通信(IPC)的方法:UNIX域套接字
    MySQL性能调优与架构设计【常见面试题】
    【Java小白福利】Java面试、学习教程合集!
    数据脱敏的场景与价值【总结】
    【GO for java programmers】面向Java开发者的GO编程3_go for java(1)
    【TES720D-KIT】青翼科技支持双网口的全国产化四核CPU+FPGA处理器开发套件
    记忆化搜索,901. 滑雪
    ArcGIS_地质多样性评价方法
  • 原文地址:https://blog.csdn.net/EGXXM/article/details/134085385