数据结构之“链表”

  • 链表是什么?
  • 数组 vs 链表
  • JS中的链表
  • LeetCode:237.删除链表中的节点
  • LeetCode:206.反转链表
  • LeetCode:2.两数相加
  • LeetCode:83.删除排序链表中的重复元素
  • LeetCode:141.环形链表
  • 前端与链表(JS中的原型链)
    • 一、instanceof的使用,并用代码实现
  • 前端链表:使用链表指针获取JSON的节点值
  • 总结
  • 思考题

链表是什么?

多个元素组成的列表
元素存储不连续,用next指针连在一起

数组 vs 链表

数组:增删非首尾元素是往往需要移动元素
链表:增删非首尾元素,不需要移动元素,只需要更改next的指向即可

JS中的链表

JavaScript中没有链表
可以用Object模拟链表

const a = { val: 'a' };
const b = { val: 'b' };
const c = { val: 'c' };
const d = { val: 'd' };
a.next = b;
b.next = c;
c.next = d;// 遍历链表
let p = a;
while (p) {console.log(p.val);p = p.next;
}// 插入
const e = { val: 'e' };
c.next = e;
e.next = d;// 删除
c.next = d;

LeetCode:237.删除链表中的节点

解题思路
无法直接获取被删除节点的上个节点
将被删除节点转移到下个节点
解题步骤
将被删节点的值改为下个节点的值
删除下个节点

时间复杂度O(1),空间复杂度O(1)

LeetCode:206.反转链表

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

解题思路
反转两个节点:将n + 1的next指向n
反转多个节点:双指针遍历链表,重复上述操作

解题步骤
双指针一前一后遍历链表
反转双指针

时间复杂度O(n),空间复杂度O(1)

LeetCode:2.两数相加

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

解题思路
小学数学题,模拟相加操作
需要遍历链表

解题步骤
新建一个空链表
遍历被相加的两个链表,模拟相加操作,将个位数追加到新链表上,将十位数留到下一位去相加

时间复杂度O(n),空间复杂度O(n)

LeetCode:83.删除排序链表中的重复元素

输入:1 -> 1 -> 2
输出:1 -> 2

解题思路
因为链表是有序的,所以重复元素一定相邻
遍历链表,如果发现当前元素和下个元素值相同,就删除下个元素值

解题步骤
遍历链表,如果发现当前元素和下个元素值相同,就删除下个元素值
遍历结束后,返回原链表的头部

时间复杂度O(n),空间复杂度O(1)

LeetCode:141.环形链表


解题思路
两个人在圆形操场上的起点同时起跑,速度快的人一定会超过速度慢的人一圈
用一快一慢两个指针遍历链表,如果指针能够相逢,那么链表就有圈

解题步骤
用一快一慢两个指针遍历链表,如果指针能够相逢,就返回true
遍历结束后,还没有相逢就返回false

时间复杂度O(n),空间复杂度O(1)

前端与链表(JS中的原型链)

原型链简介
原型链的本质是链表
原型链上的节点是各种原型对象,比如Function.prototype、Object.prototype…
原型链通过__proto__属性链接各种原型对象
原型链长啥样
obj -> Object.prototype -> null
func -> Function.prototype -> Object.prototype -> null
arr -> Array.prototype -> Object.prototype -> null
原型链知识点
如果A沿着原型链能找到B的原型对象(B.prototype),那么A instanceof B为true
如果在A对象上没有找到x属性,那么会沿着原型链找x属性

const obj = {}
const func = () => {}
const arr = []
//原型链通过__proto__属性链接各种原型对象
console.log(obj .__proto__ === Object.prototype) //true
console.log(func.__proto__ === Function.prototype) //true
console.log(func.__proto__.__proto__ === Object.prototype) //true
console.log(arr.__proto__ === Array.prototype) //true
console.log(arr.__proto__.__proto__ === Object.prototype) //true//如果A沿着原型链能找到B的原型对象(B.prototype),那么A instanceof B为true
console.log(func instanceof Function) //true
console.log(func instanceof Object) //true
//fuc的proto属性指向Function的原型对象,
//func即是object的实例,也是function的实例//如果在A对象上没有找到x属性,那么会沿着原型链找x属性
const obj = {};
Object.prototype.x = 'x'
const func = () => {};
Function.prototype.y = 'y'
console.log(obj.x) //x
console.log(obj.y) //undefined
console.log(func.x) //x
console.log(func.y) //y

一、instanceof的使用,并用代码实现

分析
知识点:如果A沿着原型链能找到B.prototype,那么A instanceof B为true
解法:遍历A的原型链,如果找到B.prototype,返回true,否则返回false

const instanceOf = (A,B) => {let p = A;while (p) {if (p === B.prototype) {return true;}p = p.__proto__;}return false;
}

var foo = {},F = Function(){};
Object.prototype.a = 'value a';
Function.prototype.b = 'value b'console.log(foo.a)
console.log(foo.b)console.log(F.a)
console.log(F.b)

分析
知识点:如果在A对象上没有找到x属性,那么会沿着原型链找x属性
解法:明确foo和F变量的原型链,沿着原型链找a属性和b属性

前端链表:使用链表指针获取JSON的节点值

const json = {a: { b: { c: 1 } },d: { e: 2 },
}
const path = ['a', 'b' ,'c']
let p =json;
path.forEach(k => {p = p[k];
})

总结

链表里的元素存储不是连续的,之间通过next连接
JavaScript中没有链表,但可以用Object模拟链表
链表常用操作:修改next、遍历链表
JS中的原型链也是一个链表
使用链表指针可以获取JSON的节点值

思考题

1、编写一个 instanceOf 方法,可以判断一个变量是否是另一个变量的实例
2、请判断一个链表是否为回文链表。题目链接:https://leetcode-cn.com/problems/palindrome-linked-list/

(五)数据结构之“链表”相关推荐

  1. 数据结构实验之链表五:单链表的拆分-sdut

    数据结构实验之链表五:单链表的拆分 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 输入N个 ...

  2. 数据结构思维 第五章 双链表

    第五章 双链表 原文:Chapter 5 Doubly-linked list 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 本章回顾了上一个练习的结果,并介绍了List接口的 ...

  3. linux内核数据结构之链表

    1.前言 最近写代码需用到链表结构,正好公共库有关于链表的.第一眼看时,觉得有点新鲜,和我之前见到的链表结构不一样,只有前驱和后继指针,而没有数据域.后来看代码注释发现该代码来自linux内核,在li ...

  4. Java实现自定义队列和树结构_Java数据结构之链表、栈、队列、树的实现方法示例...

    本文实例讲述了java数据结构之链表.栈.队列.树的实现方法.分享给大家供大家参考,具体如下: 最近无意中翻到一本书,闲来无事写几行代码,实现几种常用的数据结构,以备后查. 一.线性表(链表) 1.节 ...

  5. Python数据结构之链表(linked list)

    Python数据结构之链表 一.链表的基本知识 最近在leetcode刷题时遇到了几道关于链表的题,于是恶补了一下关于链表的知识.什么是链表?熟悉python语法的同学肯定都知道list,但是这并不是 ...

  6. php链表和联表的区别,PHP_浅谈PHP链表数据结构(单链表),链表:是一个有序的列表,但 - phpStudy...

    浅谈PHP链表数据结构(单链表) 链表:是一个有序的列表,但是它在内存中是分散存储的,使用链表可以解决类似约瑟夫问题,排序问题,搜索问题,广义表 单向链表,双向链表,环形链表 PHP的底层是C,当一个 ...

  7. php mysql 链表_浅谈PHP链表数据结构(单链表)

    链表:是一个有序的列表,但是它在内存中是分散存储的,使用链表可以解决类似约瑟夫问题,排序问题,搜索问题,广义表 单向链表,双向链表,环形链表 PHP的底层是C,当一个程序运行时,内存分成五个区(堆区, ...

  8. 【数据结构】链表 - Go 语言实现

    文章目录 一.简介 二.最简单的链表 三.循环链表 1. 初始化循环链表 2. 创建一个指定大小 N 的循环链表,值全为空 3. 获取上一个或下一个节点 4. 获取第 n 个节点 5. 获取链表长度 ...

  9. 搬砖:数据结构之链表基本操作总结

    数据结构之链表基本操作总结 2017年05月11日 18:22:11 Lily_whl 阅读数:19151 https://blog.csdn.net/Lily_whl/article/details ...

最新文章

  1. Oracle 触发器 Update 不能操作本表的疑问
  2. Cenetos 下sudo的使用
  3. 4kyu Twice linear
  4. 从代理机制到Spring AOP,这篇给你安排的明明白白的
  5. Python中的正则表达式(基础)
  6. XMLhttp学习应用
  7. 如何预热Web API,减少初次执行时间
  8. WebSocket服务器(物联网下行通知神器)
  9. CF Gym102059 H. Fractions
  10. 重装linux之后gcc等下载不了,Redhat linux下安装gcc
  11. kubernetes 启动_如何启动和组织Kubernetes聚会
  12. Windows Store App 中使用Scrollviewer实现缩放功能
  13. 平安夜,Python 送你一顶圣诞帽 @微信官方
  14. PhotoShop基础——如何抠图
  15. C语言qsort()函数用法总结
  16. 怎么设置html z值,正态分布1.96 统计学,Z=1.96怎么来的
  17. 笔记本散热不好怎么办
  18. 小尺寸 GPS 北斗 GNSS 全向内置天线方案 CA-G01 CrossAir贴片天线
  19. 2010提升你幽默感的语句
  20. 【数学】微积分的大用处

热门文章

  1. 《剑指offer》二维数组中的查找
  2. 学习python、数据结构等很多的博客
  3. 使用SublimeText 作为Python 的开发环境
  4. 运行报错error: (-215:Assertion failed) !ssize.empty() in function 'cv::resize'
  5. TensorFlow学习笔记(十九) 基本算术运算和Reduction归约计算
  6. Spark RDD使用详解3--Value型Transformation算子
  7. TransmittableThreadLocal 解决 线程池线程复用 无法复制 InheritableThreadLocal 的问题.
  8. selenium操作chrome时的一些配置
  9. GitLab CI/CD 因git凭据踩坑
  10. Android牟利之道(一)--界面嵌入有米广告