《数据结构与算法JavaScript描述》链表(学习笔记C06)

手把手教你用 JavaScript 实现常见数据结构与算法 你是否遇到过这样的场景?写前端代码时想优化列表渲染性能,却不知道用链表还是数组更高效;面试时被问“用 JS 实现一个栈”,结果卡壳在 API 设计;想自己写个小框架,却对虚拟 DOM 的树结构遍历一头雾水?本文正是为解决这些问题而生:覆盖6 类核心数据结构(数组、链表、栈、队列、树、图)和5 大经典算法(排序、搜索、递归、动态规划、贪心),用 JS 代码+生活案例,让你“既能写代码,又懂为什么这么写”。本文从“生活场景”切入,先讲数据结构(像认识工具),再讲算法(像学习工具的用法),最后用实战案例串联。 阅读详情

相关概念

1.如果你发现数组在实际使用时很慢,就可以考虑使用链表来替代它。
因为,JavaScript 中数组的主要问题是,它们被实现成了对象,与其他语言(比如 C++ 和 Java)的数组相比,效率很低
2.链表是由一组节点组成的集合。
3.每个节点都使用一个对象的引用指向它的后继。
4.指向另一个节点的引用叫做链。
5.数组元素靠它们的位置进行引用,链表元素则是靠相互之间的关系进行引用。

代码

// 1.基础链表

// Node类表示节点
// LinkedList类提供了插入节点、删除节点、显示列表元素的方法,辅助方法

// Node类
function Node(element) {
    this.element = element
    this.next = null
}

// LinkedList类
function LList() {
    this.head = new Node('head')
    this.find = find
    this.insert = insert
    this.findPrevious = findPrevious
    this.remove = remove
    this.display = display
}

// 找到一个节点--find()
function find(item) {
    var currNode = this.head
    while (currNode.element != item) {
        currNode = currNode.next
    }
    return currNode
}

// 插入新节点--insert()
function insert(newElement, item) {
    var newNode = new Node(newElement)
    var current = this.find(item)
    newNode.next = current.next
    current.next = newNode 
}

// 显示链表元素
function display() {
    var currNode = this.head
    while (!(currNode.next == null)) {
        console.log(currNode.next.element)
        currNode = currNode.next
    }
}

// var cities = new LList()
// cities.insert("Conway", "head");
// cities.insert("Russellville", "Conway");
// cities.insert("Alma", "Russellville");
// cities.display()

// 找到前一个元素
function findPrevious(item) {
    var currNode = this.head
    while (!(currNode.next == null) && (currNode.next.element != item)) {
        currNode = currNode.next
    }
    return currNode
}

// remove()
function remove(item) {
    var prevNode = this.findPrevious(item)
    if (!(prevNode.next == null)) {
        prevNode.next = prevNode.next.next
    }
} 

// 测试
var cities = new LList();
cities.insert("Conway", "head");
cities.insert("Russellville", "Conway");
cities.insert("Carlisle", "Russellville");
cities.insert("Alma", "Carlisle");
cities.display();
cities.remove("Carlisle");
cities.display();  

// 链表的其他方法
// 在链表中向前移动n个节点
// advance(n)
// 在双向链表中向后移动n个节点
// back(n)
// 只显示当前节点
// show()

// 2.循环链表

// Node类
function Node(element) {
    this.element = element
    this.next = null
}

// LinkedList类
function LList() {
    this.head = new Node('head')
    this.head.next = this.head
    this.find = find
    this.insert = insert
    this.display = display
    this.findPrevious = findPrevious
    this.remove = remove
}

// 找到一个节点--find()
function find(item) {
    var currNode = this.head
    while ((currNode.element != item) && !(currNode.next.element == 'head')) {
        currNode = currNode.next
    }
    return currNode
}

// 插入新节点--insert()
function insert(newElement, item) {
    var newNode = new Node(newElement)
    var current = this.find(item)
    newNode.next = current.next
    current.next = newNode 
}

// 显示链表元素
function display() {
    var currNode = this.head
    while (!(currNode.next == null) && !(currNode.next.element == 'head')) {
        console.log(currNode.next.element)
        currNode = currNode.next
    }
}

// 测试代码一
var cities = new LList()
cities.insert("Conway", "head");
cities.insert("Russellville", "Conway");
cities.insert("Alma", "Russellville");
cities.display()

// 找到前一个元素
function findPrevious(item) {
    var currNode = this.head
    while (!(currNode.next == null) && (currNode.next.element != item)) {
        currNode = currNode.next
    }
    return currNode
}

// remove()
function remove(item) {
    var prevNode = this.findPrevious(item)
    if (!(prevNode.next == null)) {
        prevNode.next = prevNode.next.next
    }
} 

// 测试代码二
var cities = new LList();
cities.insert("Conway", "head");
cities.insert("Russellville", "Conway");
cities.insert("Carlisle", "Russellville");
cities.insert("Alma", "Carlisle");
cities.display();
cities.remove("Carlisle");
cities.display();  

// 2.双向链表

// Node类
function Node(element) {
    this.element = element
    this.next = null
    this.previous = null
}

// LinkedList类
function LList() {
    this.head = new Node('head')
    this.find = find
    this.insert = insert
    this.display = display
    this.remove = remove
    this.findLast = findLast
    this.dispReverse = dispReverse   
}

// 找到一个节点--find()
function find(item) {
    var currNode = this.head
    while (currNode.element != item) {
        currNode = currNode.next
    }
    return currNode
}

// 插入新节点--insert()
function insert(newElement, item) {
    var newNode = new Node(newElement)
    var current = this.find(item)
    newNode.next = current.next
    newNode.previous = current
    current.next = newNode 
}

// 显示链表元素
function display() {
    var currNode = this.head
    while (!(currNode.next == null)) {
        console.log(currNode.next.element)
        currNode = currNode.next
    }
}

// 测试代码一
var cities = new LList()
cities.insert("Conway", "head");
cities.insert("Russellville", "Conway");
cities.insert("Alma", "Russellville");
cities.display()

// remove()
function remove(item) {
    var currNode = this.find(item)
    if (!(currNode.next == null)) {
        currNode.previous.next = currNode.next
        currNode.next.previous = currNode.previous
        currNode.next = null
        currNode.previous = null
    }
} 

// findLast()
function findLast() {
   var currNode = this.head
   while (!(currNode.next == null)) {
        currNode = currNode.next
   }
   return currNode 
}

// 反序显示双向链表中的元素
function dispReverse() {
    var currNode = this.head
    currNode = this.findLast()
    while (!(currNode.previous == null)) {
        console.log(currNode.element)
        currNode = currNode.previous
    }
}

// 测试代码二
var cities = new LList()
cities.insert("Conway", "head")
cities.insert("Russellville", "Conway")
cities.insert("Carlisle", "Russellville")
cities.insert("Alma", "Carlisle")
cities.display()
console.log('------------')
cities.remove("Carlisle")
cities.display()
console.log('------------')
cities.dispReverse()  

力扣相关题目

以下题目难度全部为简单:

1.1.题目描述:

  1. 删除链表中的节点
    请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。
    现有一个链表 – head = [4,5,1,9],它可以表示为: 4 —> 5 —> 1 —> 9

1.2.示例:

输入: head = [4,5,1,9], node = 5
输出: [4,1,9]
输入: head = [4,5,1,9], node = 1
输出: [4,5,9]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/delete-node-in-a-linked-list

1.3.我的解答:

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} node
 * @return {void} Do not return anything, modify node in-place instead.
 */
var deleteNode = function(node) {
    node.val = node.next.val
    node.next = node.next.next
};

2.1.题目描述:

  1. 合并两个有序链表
    将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

2.2.示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/delete-node-in-a-linked-list

2.3.我的解答:

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var mergeTwoLists = function(l1, l2) {
    // 执行用时: 128 ms, 在所有 JavaScript 提交中击败了13.19%的用户
    // 内存消耗 :38.9 MB, 在所有 JavaScript 提交中击败了100.00%的用户    
    var arr1 = []
    var arr2 = []
    // 链表转数组
    function listToArray (head) {
        var item = head
        var arr = []
        while(!(item == null)){
            arr.push(item.val)
            item = item.next
        }
        return arr
    }
    arr1 = listToArray(l1)
    arr2 = listToArray(l2)
    // 数组转链表
    function arrayToList (arr) {
        if (arr.length === 0) {
            return null
        }
        var arrs = []
        for(var i=0; i<arr.length; i++){
            arrs.push(new ListNode(arr[i]))
        }
        for(var i=0; i<arrs.length-1; i++){
            arrs[i].next = arrs[i+1]
        }
        return arrs[0]
    }
    var arr = []
    if (arr1.length && arr2.length) {
        arr = ([].concat(arr1, arr2)).sort(function(a,b){return (a-b)})
    } else if (arr1.length && !arr2.length) {
        arr = arr1.sort(function(a,b){return (a-b)})
    } else if (!arr1.length && arr2.length) {
        arr = arr2.sort(function(a,b){return (a-b)})
    } else {
        arr = []
    }
    return (arrayToList(arr))
};

3.1.题目描述:

  1. 二进制链表转整数
    给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。
    请你返回该链表所表示数字的 十进制值 。

3.2.示例:

输入:head = [1,0,1]
输出:5
输入:head = [0]
输出:0
输入:head = [1]
输出:1
输入:head = [1,0,0,1,0,0,1,1,1,0,0,0,0,0,0]
输出:18880
输入:head = [0,0]
输出:0

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/convert-binary-number-in-a-linked-list-to-integer

3.3.我的解答:

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @return {number}
 */
var getDecimalValue = function(head) {
    if(!head.next){
        return head.val
    }
    var arr = []
    var obj = {}
    do{
        arr.push(head.val)
        head = head.next
    }while(head.next !== null)
    arr.push(head.val)
    var add = 0
    for(var i=0; i<arr.length; i++){
        if(arr[arr.length-1-i] === 1){
            add += Math.pow(2,i)
        }
    }
    return add
};

4.1.题目描述:

面试题24. 反转链表
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

4.2.示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/delete-node-in-a-linked-list

4.3.我的解答:

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var reverseList = function(head) {
    // console.log(head)
    var arr = []
    var item = head
    function ListNode(val) {
       this.val = val;
       this.next = null;
    }
    while(item !== null){
        arr.push(item.val)
        item = item.next
    }
    arr = arr.reverse()
    // console.log('arr', arr)
    function list(ary) {
        if(ary.length === 0) {
            return null
        }
        var nodes = []
        for(var i = 0; i < ary.length; i++) {
            var node = new ListNode(ary[i])
            nodes.push(node)
        }
        for(var i = 0; i < nodes.length - 1; i++) {
            nodes[i].next = nodes[i + 1]
        }
        return nodes[0]
    }
    ListNode = list(arr)
    // console.log(ListNode)
    return ListNode
};

5.1.题目描述:

面试题18. 删除链表的节点
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
返回删除后的链表的头节点。

5.2.示例:

输入: head = [4,5,1,9], val = 5
输出: [4,1,9]
输入: head = [4,5,1,9], val = 1
输出: [4,5,9]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shan-chu-lian-biao-de-jie-dian-lcof

5.3.我的解答:

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} val
 * @return {ListNode}
 */
var deleteNode = function(head, val) {
    var item = head
    // 找到前一个节点
    // var currNode = head
    // while(!(currNode.next == null) && (currNode.next.val != val)) {
    //     currNode = currNode.next
    // }
    // var prevNode = currNode
    // if (!(prevNode.next == null)) {
    //     prevNode.next = prevNode.next.next
    // }
    // 如果链表只有一层
    if (head.next == null){
        return null
    }
    while(!(item.next == null)){
        // 如果链表超过一层并且删除链表头元素
        if (item.val == val) {
            head = item.next
        }
        if (item.next.val === val) {
            item.next = item.next.next
        } else {
            item = item.next
        }
    }
    return head
};
2024年最全数据结构与算法:终于可以用三种语言(C,C#,JavaScript,斩获offer 队列在C语言上只能自己构造,好在我们前面有链表、有顺序表,我们可以复制过来一个链表程序构造一个队列,于是从链表程序中复制过来b5.c或者b6.c即可,我们分析队列的ADT可知,最需要的队列功能需求是:修改的这个链表结点函数、仅仅加了第14行,在过去,所以结点删除后,最后的尾巴结点指针Tail所指的存储空间被释放,导致这个指针变量不可用,现在在结点个数为0的情况下,再次让尾结点指向头结点,保证下次进入链表的数据依然正确。补充main()函数,测试多批次进入队列、出队列,全部程序见B0.c。 阅读详情

相关推荐

华为OD机试 - 单向链表中间节点(Java & JS & Python & C & C++)

## 题目描述 给定一个单链表 L,请编写程序输出 L 中间结点保存的数据。 如果有两个中间结点,则输出第二个中间结点保存的数据。例如: 给定 L 为 1→7→5,则输出应该为7; 给定 L 为 1→2→3→4,则输出应该为3; 输入描述 每个输入包含1个测试用例。 每个测试用例: 第一行给出链表首结点的地址、结点总个数正整数 N (≤ 10^5)。结点的地址是5位非负整数,NULL地址用-1表示。 接下来有N行,每行格式位: Address Data Next 其中Address是结点地址,

m0_66793065的博客 4339

Javascript描述-数据结构与算法

☆     数据结构是以某种形式将数据组织在一起的集合,它不仅存储数据,还支持访问和处理数据的操作。算法是为求解一个问题需要遵循的、被清楚指定的简单指令的集合。      下面是我总结整理出的关于数据结构与算法的相关内容,如有错误,欢迎交流。本文中对于方法的封装均采用JavaScript语言来实现。...

weixin_43689100的博客 402

JavaScript数据结构转换:数组与链表互转实战

链表节点类最基本的属性是value和next,分别表示节点存储的值和指向下一个节点的引用。在 JavaScript 中,我们可以使用类(class)来定义节点类。// 节点存储的数据// 指向下一个节点的引用属性说明:属性名类型描述valueany节点中存储的数据,可以是任意类型next指向下一个节点的引用,若为链表尾节点,则为 null该类设计简单明了,仅包含两个基础属性,便于后续扩展。例如,若需要支持双向链表,可以添加prev。

weixin_34162851的博客 1131

资料分享:送你一本《数据结构与算法JavaScript描述》电子书!

数据结构 是掌握计算机编程必须具备的技能。通常情况下,我想掌握一门编程语言所用的方法就是利用这门语言把数据结构中线性表、栈、队列、字符串、动态数字、整数集合、树、图、搜索、排序等涉及的算法全部写一遍。写完之后,基本上就把这门语言搞定了。 今天给大家分享的就是我从网上找到的利用 JavaScript 语言来实现各种数据结构的算法,希望这本电子书对学习 JavaScript 想从事前端工作的读者有益。...

老马的程序人生 4380

JavaScript实现链表环检测算法

在计算机科学中,链表是一种基础且广泛使用的数据结构。链表由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针。这种结构的灵活性使得链表在插入和删除操作中比数组更高效,因为它们不需要移动元素以填补空位或创建空位。链表可以是单向的,也可以是双向的,甚至是循环的,其中最后一个节点指向链表的开始,形成一个环。链表在多种编程语言中都有实现,并且经常出现在软件工程的面试问题中。理解链表的数据结构以及相关的操作是每个IT专业人士必备的技能。

weixin_42103128的博客 301

域用户无法修改密码问题的解决方案

问题描述:加域的电脑无法更改密码,提示“无法更新密码,为新密码提供的值不符合字符域的长度、复杂度或历史要求”。 问题原因:域控制器中相关设置问题,主要如下图所示(如启用复杂性、最短期限和强制密码历史) 解决方案:在域控制器中更改对应的密码策略即可: ① 禁用复杂性要求 ② 最短使用期限改为0天 ③ 强制密码历史改为0 如果出现无法更改的情况,如下图箭头所指的图标所示 代表需要在域控制器的组策...

运维日记 3万+

JS中的算法与数据结构——链表

链表(Linked-list) 底层存储的数据的数据结构都是数组。 但是数组不总是最佳的数据结构,因为,在很多编程语言中,数组的长度都是固定的,如果数组已被数据填满,再要加入新的元素是非常困难的。而且,对于数组的删除和添加操作,通常需要将数组中的其他元素向前或者向后平移,这些操作也是十分繁琐的。 然而,JS中数组却不存在上述问题,主要是因为他们被实现了成了对象,但是与其他语言相比(比如C或Java),那么它的效率会低很多。 这时候,我们可以考虑使用链表(Linked-list) 来替代它,除了对数据

sunlizhen的专栏 258

嵌入式通信协议----Wi-Fi协议详解(一)

Wi-Fi,又称“无线网络”,是Wi-Fi联盟的商标,一个基于IEEE 802.11标准的无线局域网技术。“Wi-Fi”常写作“WiFi”或“Wifi”,但是这些写法并没有被Wi-Fi联盟认可。Wi-Fi产品经由Wi-Fi联盟的一家独立授权测试实验室进行严格测试,产品成功通过测试后,授予制造商或销售商使用Wi-Fi标志、Wi-Fi CERTIFIED标志和相关商标,Wi-Fi联盟使用术语“Wi-Fi CERTIFIED”来称呼这类通过认证的产品。

聪聪的成长之路 1656

Javascript数据结构与算法

文章目录Javascript数据结构与算法什么是数据结构与算法线性结构数组数组使用的API链表链表原理自定义链表双向链表栈自定义栈栈常见的操作栈的封装栈的应用十进制转二进制队列自定义队列队列常见的操作队列的封装优先级队列队列的应用哈希表哈希表理论认识哈希表认识哈希化地址的冲突哈希表效率自定义哈希表哈希函数哈希表实现哈希扩容树结构树相关的概念树的基本概念二叉树的概念二叉搜索树图结构排序&搜索...

MOOG007的博客 368

STM32+ESP8266接入OneNet的MQTT嵌入式实现

MQTT是一种轻量级发布/订阅模式的消息传输协议,广泛应用于资源受限的物联网终端设备通信。其基于TCP/IP栈构建,具备低带宽占用、小代码体积和高可靠性等技术优势,特别适合STM32等MCU与Wi-Fi模组协同工作的边缘节点场景。在实际工程中,需结合AT指令集控制ESP8266完成Wi-Fi连接、TCP建链及MQTT会话管理,并通过环形缓冲区、空闲中断检测等机制保障UART异步通信稳定性。本文围绕STM32F103与ESP8266硬件协同、OneNet平台对接、JSON消息解析与OLED状态反馈等关键环节,

yhn456789的博客 1037

告别‘火龙’:实测BES2800/RK2108等主流芯片,聊聊AI眼镜的功耗与散热‘内卷’实战

本文深入探讨了AI智能眼镜在功耗与散热方面的挑战,重点分析了恒玄BES2800和瑞芯微RK2108等主控芯片的能效表现。通过实测数据和优化策略,揭示了在6nm工艺、异构计算和系统级散热方案下的实战经验,为AI眼镜的功耗管理提供了实用解决方案。

weixin_30839881的博客 946

JS-链表与算法题解析

@JS-链表数据结构-Linked list 一、什么是链表 [维基百科] 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。 二、链表分类 链表常用的有 3 类: 单链表、双向链表、循环链表。 一般来说,说到链表,就要提下数组,一般链表都是和数组进行对比。 三、链表设计 说到链表,就要提下数组,一般链表都是和数组进行对比。 在很多编程语言中,数组的长度时固定的,所以数组中的增加和删除比较麻烦

雷欧奥特曼的博客 730

HTB_Bike靶机之模板注入

船到桥头自然直 文章目录信息收集模板引擎SSIT 模板注入后放答案 信息收集 日常 A 扫描,两个端口 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.4 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 3072 48:ad:d5:b8:3a:9f:bc:be:f7:e8:20:1e:f6:bf:de:ae (RSA) | 256 b7:89:6c:0b:20:ed:49:b2:c1:86:7c:.

网络安全学习 798

JavaScript实现数据结构与算法(二)线性结构

JavaScript实现数据结构与算法(二)线性结构 目录 1. 重要性 2. 线性结构【本文】 3. 哈希表 4. 树结构 5. 图结构 6. 排序和搜索 2. 线性结构 2.1 数组的特点 2.1.1 普通数组 优点:通过下标取元素效率非常高。 缺点:常见语言数组不能存放不同类型的数据,所以一般都先封装一个Object类型 2.1.2 底层数组 扩容方法:新建一个大的数组,把原有数组写进去,再...

weixin_43545225的博客 1700

码农新宠大对决:GitHub Copilot、通义灵码和CodeLlama谁主沉浮?

本文对三款主流AI编程工具GitHub Copilot、通义灵码和CodeLlama进行了全面对比分析。GitHub Copilot在多语言支持和代码质量上表现突出;通义灵码在中文理解和阿里云生态集成方面优势明显;CodeLlama则以开源可定制见长。文章从代码生成、理解能力、多语言支持、使用体验等维度展开评测,并结合实际案例说明不同开发者群体的适用选择。建议新手可优先考虑通义灵码,经验开发者适合GitHub Copilot,而有定制需求的企业团队则可选择CodeLlama。随着AI技术发展,这些工具将持续

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 675

uniapp - 应用软件在运行时,未见向用户告知权限申请的目的,向用户索取(存储、相机、电话)等权限,不符合华为应用市场审核标准(uniApp开发安卓APP上架应用市场审核被拒绝驳回,详细解决方案)

uniApp应用软件在运行时,未见向用户告知权限申请的目的,向用户索取(存储、相机、电话)等权限,不符合华为应用市场审核标准。uniapp vue2 vue3解决软件在运行时,未见向用户告知权限申请的目的,华为等上架被拒问题,关于华为应用市场上架需要同步告知使用权限的解决方案,uniApp应用软件在运行时,不符合华为应用市场审核标准。解决方案合集!app上架-您的应用在运行时,未同步告知权限申请的使用目的,向用户索取(相机)等权限,不符合华为应用市场审核标准。华为应用市场审核新规(未同步告知权限申请的使用目

🏆 前端领域优质创作者 4164

js数据结构之链表

在经过为期10天左右的苦逼的数据结构的学习,终于在今天用js实现了单链表。学习的时候是用c语言学的,奈何c语言一般,实现起来特别难。不过它的主要思想还是可以理解的。今天看着别人的博客,自己也跟着他们去实现。我这个的话是没有头节点而是头指针,代码里面也有注释,之后希望还可以去实现树结构,再次分享,请多多指教! //创建结点 function Node(element) { ...

qq_43817972的博客 192

【HALCON工业视觉应用探索】10. C#+Halcon 3D视觉实战:点云处理与三维测量工业指南(附完整代码与实操案例)

摘要:本文聚焦C#+Halcon在3D视觉领域的工业应用,从新手友好的“基础3D检测系统”切入,逐步深入“汽车铸件三维测量”等工业级场景。内容涵盖核心概念(点云数据结构、3D采集原理、坐标系统)、完整技术流程(数据采集→预处理→特征提取→三维测量→结果可视化)、工业级代码实现(多视角点云融合、微缺陷检测、高精度尺寸测量),以及现场落地关键技巧(硬件选型、标定流程、抗干扰优化)。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2004

06_JavaScript数据结构与算法(六)单向链表

JavaScript 数据结构与算法(六)单向链表 认识链表 链表和数组 链表和数组一样,可以用于存储一系列的元素,但是链表和数组的实现机制完全不同。 数组 存储多个元素,数组(或列表)可能是最常用的数据结构。 几乎每一种编程语言都有默认实现数组结构,提供了一个便利的 [] 语法来访问数组元素。 数组缺点: 数组的创建需要申请一段连续的内存空间(一整块内存),并且大小是固定的,当前数组不能满足容量需求时,需要扩容。 (一般情况下是申请一个更大的数组,比如 2 倍,然后将原数组中的元素复制过去)

酒客的博客 216

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【数据结构与算法】多种语言(VB、C、C#、JavaScript)系列数据结构算法经典案例教程合集目录

文章目录1. 专栏简介2. 专栏地址3. 专栏目录 1. 专栏简介 2. 专栏地址 「 刘一哥与GIS的故事 」之《数据结构与算法》 3. 专栏目录 【经典回放】多种语言系列数据结构算法:二叉树(JavaScript版) 【经典回放】多种语言系列数据结构算法:二叉树(C#版) 【经典回放】多种语言系列数据结构算法:树(C#、JavaScript、VB6版) 【经典回放】多种语言系列数据结构线性表之一:顺序表 【经典回放】多种语言系列数据结构线性表之二:链表 【经典回放】多种语言系列数据结构算法:串(C

智慧空间实验室 814

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【学点数据结构和算法】02-链表

        上一篇博客博主为大家带来了数组的内容分享,本篇博客我们来学习另外一个重要的数据结构——链表! 概念         链表是一种链式数据结构,由若干节点组成,每个节点包含当前节点的数据和指向下一节点的指针。链表的物理存储方式是随机存储,访问方式是顺序访问。查找链表节点的时间复杂度是O(n),中间插入、删除节点的时间复杂度是O(1)。

大数据梦想家 6394

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

JS中的算法与数据结构——链表(Linked-list)

@TOC 链表(Linked-list) 数组不总是最佳的数据结构,因为,在很多编程语言中,数组的长度都是固定的,如果数组已被数据填满,再要加入新的元素是非常困难的。而且,对于数组的删除和添加操作,通常需要将数组中的其他元素向前或者向后平移,这些操作也是十分繁琐的。 然而,JS中数组却不存在上述问题,主要是因为他们被实现了成了对象,但是与其他语言相比(比如C或Java),那么它的效率会低很多。 这...

我是谁的博客 389

【数据结构与算法——TypeScript】数组、栈、队列、链表

什么是算法(Algorithm)?算法(Algorithm)的认识:解决问题的过程中,不仅仅 数据的存储方式会影响效率,算法的优劣也会影响效率;前端算法学习:**算法的通俗**理解 - **Algorithm**这个单词本意就是 **解决问题的办法/步骤逻辑**。 - **数据结构的实现,离不开算法**。

羊羊羊羊羊羊羊的博客 1710

JavaScript 数据结构与算法之美 - 强烈推荐 GitHub 上值得前端学习的数据结构与算法项目

前言 算法为王。 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手;只有内功深厚者,前端之路才会走得更远。 强烈推荐 GitHub 上值得前端学习的数据结构与算法项目,包含 gif 图的演示过程与视频讲解。 GitHub 项目 数据结构与算法 关于数据结构与算法的 GitHub 项目,star 数由高到低排序。 javascript-algorithms(...

嘿嘿 1224

视频教程-C语言开发之数据结构与算法一-C/C++

C语言开发之数据结构与算法一 从事技术开发已经10年左右,拥有丰富的开发经验...

weixin_31769585的博客 718
上一篇: 《数据结构与算法JavaScript描述》队列(学习笔记C05)
下一篇: 《数据结构与算法JavaScript描述》字典(学习笔记C07)
magic-fish
博客等级 码龄9年 3粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值