刷题笔记day03-链表

前言

今天是刷题的第三天,坚持就是胜利

203.移除链表元素

增加一个头结点,这样可以统一删除操作

另外,遇到等于的值,就让 prev 指向 curr.Next ,同时将curr更新指向 prev.Next。

go 复制代码
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func removeElements(head *ListNode, val int) *ListNode {
    // 思路:增加一个头结点,并且设置一个prev指针,用于删除
    newHead := &ListNode{}
    newHead.Next = head
    prev := newHead
    curr := newHead
    for curr != nil {
        if curr.Val == val {
            prev.Next = curr.Next
            curr = prev.Next
        } else {
            prev = curr
            curr = curr.Next
        }
    }
    return newHead.Next
}

707. 设计链表

测试代码,

go 复制代码
type Node struct {
    Val int
    Next *Node
}

type MyLinkedList struct {
    Size int
    Head *Node
}


func Constructor() MyLinkedList {
    // 带有虚拟头节点
    head := &Node{
        Val: -1,
        Next: nil,
    }
    return MyLinkedList{0, head}
}


func (this *MyLinkedList) Get(index int) int {

    // 判断非法性
    if (index < 0 || index > (this.Size - 1)) {
        return -1
    }
    node := this.Head
    for i := 0; i <= index; i++ {
        if node == nil {
            return -1
        } else {
            node = node.Next
        }
    }
    return node.Val
}


func (this *MyLinkedList) AddAtHead(val int)  {
    node := &Node {
        Val: val,
        Next: nil,
    }
    node.Next = this.Head.Next
    this.Head.Next = node
    this.Size++
}


func (this *MyLinkedList) AddAtTail(val int)  {
    node := this.Head
    // node指向最后一位非nil
    for node.Next != nil {
        node = node.Next
    }
    node.Next = &Node{
        Val: val,
        Next: nil,
    }
    this.Size++
}


func (this *MyLinkedList) AddAtIndex(index int, val int)  {
    if index > this.Size {
        return 
    }else if index == this.Size { //直接添加到末尾
        this.AddAtTail(val) 
        return
    }else if index < 0 {
        index = 0
    }

    // header 指向插入位置的前一位
    header := this.Head
    for i := 0; i <= index - 1; i++ {
        header = header.Next
    }
    node := &Node{val, nil}
    node.Next = header.Next
    header.Next = node
    this.Size++
}


func (this *MyLinkedList) DeleteAtIndex(index int)  {
    // 判断是否有效
    if index >= this.Size || index < 0 {
        return
    }
    // header 指向插入位置的前一位
    header := this.Head
    for i := 0; i <= index - 1; i++ {
        header = header.Next
    }
    header.Next = header.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);
 */

206. 反转链表

// 使用双指针,pre指向前一个,curr指向当前的,前后调转方向既可。

go 复制代码
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func reverseList(head *ListNode) *ListNode {
    // 使用双指针
    var prev *ListNode
    curr := head
    var tmp *ListNode
    for curr != nil {
        tmp = curr.Next
        curr.Next = prev
        prev = curr
        // curr往后移动一位
        curr = tmp
    }
    return prev
}
相关推荐
John_ToDebug3 小时前
判断力无法被 AI 替代,但它正在被你亲手扔掉
经验分享·笔记
吞下星星的少年·-·4 小时前
The 2026 ICPC Asia East Continent Online Contest (II)(构造)
数据结构·算法
柳鲲鹏5 小时前
运气学概论:提纲草案
笔记
疯狂打码的少年7 小时前
【计算机网络】子网掩码与子网划分计算(含CIDR表示法)
服务器·笔记·计算机网络·php
Msshu1237 小时前
2~5串锂电快充优选|XSP36 Type‑C升压/升降压快充管理芯片
数据结构·随机森林·贪心算法·排序算法·线性回归·启发式算法
自小吃多9 小时前
PCB Editor软件复制、改变、删除操作笔记
笔记·嵌入式硬件
动词ing10 小时前
【学习笔记】数据结构栈与队列(栈先进后出+队列先进先出+括号匹配+消消乐模型)
数据结构·笔记·学习
彧azz11 小时前
Git 入门实操实例:从安装到远程仓库全流程
大数据·笔记·git·学习·elasticsearch
a1879272183111 小时前
【算法】链表(二):链表上的双指针——变速、异链与定距,和一份路程账本
数据结构·算法·leetcode·链表·go·指针·环形链表
zcmodeltech12 小时前
火电厂模型能演示冷态启动和故障处理吗?——基于STM32与Modbus RTU的集控实训控制系统设计
数据结构·stm32·单片机·嵌入式硬件·能源