刷题笔记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
}
相关推荐
lll23526917798 小时前
2026行业语音转写工具专业术语转写功能横向分析
笔记·智能手机
BK贝壳11 小时前
bool-hybrid-array 落盘我只认 .bha:用 Create_BHA / Ask_BHA 做布尔数组序列化
数据结构·python·numpy·1024程序员节
?abc!14 小时前
(数组)581. 最短无序连续子数组
数据结构·算法·leetcode
解决小子17 小时前
【虚幻引擎】【C++】【GAS框架】构建角色基类、属性集、数值钳制
c++·笔记·游戏引擎·虚幻·gas·能力系统
爱读书的小胖18 小时前
LeetCode 55 跳跃游戏 C 语言解题分析
c语言·数据结构·算法·leetcode·1024程序员节
破芽18 小时前
learn-claude-code-s05-s11-学习笔记
笔记·学习
舰长11518 小时前
将百万数据插入到 Redis,有哪些实现方案?
数据结构·redis·开源
若亦_19 小时前
数据结构>>优先级队列(堆)
java·数据结构
程序猿乐锅19 小时前
【从0-1学习Python | 第七篇】Python 面向对象基础
开发语言·笔记·后端·python·学习·1024程序员节
fish_zzzz20 小时前
笔记--浅谈内存,存储空间,BIOS芯片,显卡GPU、VRAM(1)
笔记·1024程序员节