当前位置: 首页 > article >正文

【JavaScript】LeetCode:707设计链表

文章目录

  • 题目内容
  • 题目分析
    • (1) 获取第n个节点的值
    • (2) 头部插入节点
    • (3) 尾部插入节点
    • (4) 第n个节点前插入节点
    • (5) 删除第n个节点
  • 完整代码

题目内容

在这里插入图片描述

题目分析

  • 添加哨兵节点dummy。
  • 在第n个节点前插入节点时,应该找到第n - 1个节点(即前一个节点),才能完成插入操作。
  • 在删除第n个节点时,应该找到第n - 1个节点(即前一个节点),才能完成删除操作。

(1) 获取第n个节点的值

  • cur指向头节点(第0个节点是头节点),cur向后移动n次后,指向第n个节点。
MyLinkedList.prototype.get = function(index) {
    if(index < 0 || index > this.size - 1){
        return -1;
    }
    var cur = this.dummy.next;
    while(index){
        cur = cur.next;
        index--;
    }
    return cur.val;
};

(2) 头部插入节点

  • 新建待插入节点headNode。
  • ① headNode节点指向头节点。
  • ② 哨兵节点指向headNode节点。
  • 链表长度+1。
MyLinkedList.prototype.addAtHead = function(val) {
    var headNode = new ListNode(val);
    headNode.next = this.dummy.next;
    this.dummy.next = headNode;
    this.size++;
};

(3) 尾部插入节点

  • 新建待插入节点tailNode,新建节点自动指向null。
  • cur指向哨兵节点,cur一直向后移动,直到找到尾节点。
  • ① 原尾节点指向tailNode节点,tailNode节点成为新尾节点。
  • 链表长度+1。
MyLinkedList.prototype.addAtTail = function(val) {
    var tailNode = new ListNode(val);
    var cur = this.dummy;
    while(cur.next != null){
        cur = cur.next;
    }
    cur.next = tailNode;
    this.size++;
};

(4) 第n个节点前插入节点

  • 新建待插入节点newNode。
  • cur指向哨兵节点,cur向后移动n次后,指向第n - 1个节点。
  • ① newNode节点指向第n个节点。
  • ② 第n - 1个节点指向newNode节点。
  • 链表长度+1。
MyLinkedList.prototype.addAtIndex = function(index, val) {
    if(index < 0 || index > this.size){
        return;
    }
    var newNode = new ListNode(val);
    var cur = this.dummy;
    while(index){
        cur = cur.next;
        index--;
    }
    newNode.next = cur.next;
    cur.next = newNode;
    this.size++;
};

(5) 删除第n个节点

  • cur指向哨兵节点,cur向后移动n次后,指向第n - 1个节点。
  • ① 第n - 1个节点指向第n + 1个节点(第n个节点的下一个节点)。
  • 链表长度-1。
MyLinkedList.prototype.deleteAtIndex = function(index) {
    if(index < 0 || index > this.size - 1) {
        return;
    }
    var cur = this.dummy;
    while(index){
        cur = cur.next;
        index--;
    }
    cur.next = cur.next.next;
    this.size--;    
};

完整代码

function ListNode(val, next) {
    this.val = (val===undefined ? 0 : val);
    this.next = (next===undefined ? null : next);
}

var MyLinkedList = function() {
    this.size = 0;
    this.dummy = new ListNode();
};

/** 
 * @param {number} index
 * @return {number}
 */
MyLinkedList.prototype.get = function(index) {
    if(index < 0 || index > this.size - 1){
        return -1;
    }
    var cur = this.dummy.next;
    while(index){
        cur = cur.next;
        index--;
    }
    return cur.val;
};

/** 
 * @param {number} val
 * @return {void}
 */
MyLinkedList.prototype.addAtHead = function(val) {
    var headNode = new ListNode(val);
    headNode.next = this.dummy.next;
    this.dummy.next = headNode;
    this.size++;
};

/** 
 * @param {number} val
 * @return {void}
 */
MyLinkedList.prototype.addAtTail = function(val) {
    var tailNode = new ListNode(val);
    var cur = this.dummy;
    while(cur.next != null){
        cur = cur.next;
    }
    cur.next = tailNode;
    this.size++;
};

/** 
 * @param {number} index 
 * @param {number} val
 * @return {void}
 */
MyLinkedList.prototype.addAtIndex = function(index, val) {
    if(index < 0 || index > this.size){
        return;
    }
    var newNode = new ListNode(val);
    var cur = this.dummy;
    while(index){
        cur = cur.next;
        index--;
    }
    newNode.next = cur.next;
    cur.next = newNode;
    this.size++;
};

/** 
 * @param {number} index
 * @return {void}
 */
MyLinkedList.prototype.deleteAtIndex = function(index) {
    if(index < 0 || index > this.size - 1) {
        return;
    }
    var cur = this.dummy;
    while(index){
        cur = cur.next;
        index--;
    }
    cur.next = cur.next.next;
    this.size--;    
};

/**
 * Your MyLinkedList object will be instantiated and called as such:
 * var obj = new MyLinkedList()
 * var param_1 = obj.get(index)
 * obj.addAtHead(val)
 * obj.addAtTail(val)
 * obj.addAtIndex(index,val)
 * obj.deleteAtIndex(index)
 */

http://www.kler.cn/a/305241.html

相关文章:

  • Typescript类型运算符、关键字以及内置高级类型
  • 自动驾驶3D目标检测综述(一)
  • 障碍检测与避障控制 ROS2机器人
  • 行业类别-智能制造-子类别工业4.0-细分类别物联网应用-应用场景智能工厂建设
  • SSE (Server-Sent Events) 服务器实时推送详解
  • Select,poll,epoll和IO多路复用和NIO
  • Python版《天天酷跑+源码》,详细讲解,手把手教学-python游戏开发
  • jmeter设置全局token
  • (180)时序收敛--->(30)时序收敛三十
  • 大模型教程:使用 Milvus、vLLM 和 Llama 3.1 搭建 RAG 应用
  • 怎么让手机ip地址变化?介绍几种实用方法
  • uniapp 微信小程序自定义tabbar层级低于canvas解决方案
  • 见刊丨“GPU池化”术语发布
  • 本地内存和分布式缓存(面试)
  • Python Web 开发中的性能优化策略(二)
  • git 命令---想要更改远程仓库
  • 指针与函数传递
  • C++速通LeetCode简单第12题-二叉树的直径
  • 深度学习-目标检测(四)-Faster R-CNN
  • C#实现串口中继
  • 不废话简单易懂的Selenium 页面操作与切换
  • Python实现一个简单的爬虫程序(爬取图片)
  • postgresql 导出CSV格式数据
  • 电脑连手机热点,上不了网
  • CSS 响应式设计(补充)——WEB开发系列36
  • [数据集][图像分类]痤疮严重程度分级分类数据集999张3类别