[链表] - 代码随想录 707. 设计链表

链表 - 代码随想录 707. 设计链表

1. 题目要求

在链表类中需要实现以下功能:

  1. get(index) :获取链表中第 index 个节点的值(索引无效时返回 -1)
  2. addAtHead(val) :在链表头部插入值为 val 的新节点
  3. addAtTail(val) :在链表尾部追加值为 val 的新节点
  4. addAtIndex(index, val) :
    • 在指定索引 index 前插入新节点
    • 当 index = 链表长度 时插入到末尾
    • index > 链表长度 时不插入
    • index < 0 时插入到头部
  5. deleteAtIndex(index):删除指定索引的节点(索引无效时不操作)

2. 实现代码

java 复制代码
/**
 * 单链表实现类
 * 核心技巧:使用虚拟头节点(dummy head)简化边界处理
 */
class MyLinkedList {
    // 虚拟头节点(不存储实际数据)
    private Node dummyHead;
    // 链表当前长度
    private int size;
    
    // 节点内部类
    private class Node {
        int val;
        Node next;
        
        Node(int val, Node next) {
            this.val = val;
            this.next = next;
        }
    }

    // 构造函数初始化空链表
    public MyLinkedList() {
        this.dummyHead = new Node(0, null); // 虚拟头节点
        this.size = 0;                      // 初始长度
    }
    
    /**
     * 获取节点值
     * @param index 目标索引(0-indexed)
     * @return 值或-1(索引无效时)
     */
    public int get(int index) {
        // 索引有效性检查
        if (index < 0 || index >= size) return -1;
        
        Node curr = dummyHead.next; // 从实际头节点开始
        // 遍历到目标节点
        for (int i = 0; i < index; i++) {
            curr = curr.next;
        }
        return curr.val;
    }
    
    /**
     * 头部插入
     * 时间复杂度:O(1)
     */
    public void addAtHead(int val) {
        // 新节点指向原头节点,虚拟头节点指向新节点
        dummyHead.next = new Node(val, dummyHead.next);
        size++;
    }
    
    /**
     * 尾部插入
     * 时间复杂度:O(n)
     */
    public void addAtTail(int val) {
        Node curr = dummyHead;
        // 遍历到最后一个节点
        while (curr.next != null) {
            curr = curr.next;
        }
        // 尾部插入新节点
        curr.next = new Node(val, null);
        size++;
    }
    
    /**
     * 指定位置插入
     * 处理三种特殊情况:
     * 1. index < 0 → 头部插入
     * 2. index = size → 尾部插入
     * 3. index > size → 不操作
     */
    public void addAtIndex(int index, int val) {
        // 处理负索引(插入头部)
        if (index < 0) {
            addAtHead(val);
            return;
        }
        // 超范围索引不操作
        if (index > size) return;
        
        Node curr = dummyHead;
        // 定位到插入位置的前驱节点
        for (int i = 0; i < index; i++) {
            curr = curr.next;
        }
        // 创建新节点并插入
        curr.next = new Node(val, curr.next);
        size++;
    }
    
    /**
     * 删除节点
     * 注意:需确保前驱节点.next不为空
     */
    public void deleteAtIndex(int index) {
        // 索引有效性检查
        if (index < 0 || index >= size) return;
        
        Node curr = dummyHead;
        // 定位到删除位置的前驱节点
        for (int i = 0; i < index; i++) {
            curr = curr.next;
        }
        // 跳过目标节点(自动GC回收)
        curr.next = curr.next.next;
        size--;
    }
}

/**
 * 使用示例:
 * MyLinkedList obj = new MyLinkedList();
 * int param_1 = obj.get(index);
 * obj.addAtHead(val);
 * obj.addAtTail(val);
 * obj.addAtIndex(index,val);
 * obj.deleteAtIndex(index);
 */

3. 关键实现细节

  1. 虚拟头节点(dummy head)

    • 始终位于链表头部之前,确保空链表操作统一
    • 消除头节点操作的特殊逻辑分支
    • 插入/删除操作无需单独处理头节点情况
  2. 时间复杂度控制

    操作 时间复杂度 说明
    addAtHead O(1) 直接操作虚拟头节点
    get O(n) 需遍历到指定位置
    addAtTail O(n) 需遍历到链表末尾
    addAtIndex O(n) 需遍历到目标位置前驱节点
    deleteAtIndex O(n) 需遍历到目标位置前驱节点
  3. 边界处理强化

    • 所有操作前进行索引有效性验证
    • addAtIndex 明确处理负索引和超范围索引
    • deleteAtIndex 确保不操作无效索引
  4. 结构设计要点

    • 内部 Node 类封装节点数据与指针
    • size 计数器实时维护链表长度
    • 所有操作后同步更新 size 值
相关推荐
BK贝壳2 小时前
bool-hybrid-array 落盘我只认 .bha:用 Create_BHA / Ask_BHA 做布尔数组序列化
数据结构·python·numpy·1024程序员节
企业数字化笔记5 小时前
视频人体姿态怎么做三维可视化?2D关键点、深度局限与技术选型
人工智能·算法·音视频
?abc!5 小时前
(数组)581. 最短无序连续子数组
数据结构·算法·leetcode
小郎君6588 小时前
MPTT树复选框的半选状态:一棵百万节点树从递归到计数器,再到区间覆盖
算法
酌沧8 小时前
MemT让记忆成为模型内生能力
jvm·人工智能·算法
Shimeri9 小时前
越卷越像:我用遗传算法做了个"内卷"实验
算法·three.js·数据可视化·遗传算法·进化算法
Evand J9 小时前
【PMSM例程1】永磁同步电机(PMSM)转速与转子电角度观测算法|基于扩展卡尔曼滤波(EKF)的传感器状态估计与误差。附下载链接
算法·电机·1024程序员节·卡尔曼滤波
guo_wen_qiang9 小时前
二叉树的层序遍历-使用双端队列Deque
算法·leetcode·1024程序员节
爱读书的小胖9 小时前
LeetCode 55 跳跃游戏 C 语言解题分析
c语言·数据结构·算法·leetcode·1024程序员节
CCblandy9 小时前
前缀缓存命中率不靠引擎靠排列:本机仿真 3 轮,易变字段放开头 98.0%→0.0%
人工智能·python·算法·自然语言处理·性能优化