【第十四天 - Linked list介绍】

Q1. linked list是什麽

  • 是一种资料结构,透过很多节点(Node)串接成一个 linked list 型态的资料。
  • 以 python 宣告的 ListNode class 为例
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

  • 你可以在 python 中宣告一个名为 linked_data 的 ListNode 结构(没有给参数,则根据 ListNode 预设值创建),宣告一个名为 data_1 的 ListNode 结构,val 为 1
linked_data = ListNode()
data_1 = ListNode(1)

linked_data.next = data_1 
  • 画出来的型态如下图
    https://ithelp.ithome.com.tw/upload/images/20210914/20140592P7OlC1bTkm.png

  • linked list 的资料结构可以实作新增、删除的功能

    • 删除 linked list中的一个,只需要将指向下一个节点 next 修改成要指向的新 node

    https://ithelp.ithome.com.tw/upload/images/20210914/201405925fnKcgjL24.png

    • 新增的功能,只要将新增的Node指向即将插入的後一个 Node,然後再让前一个 Node 指向新Node

      https://ithelp.ithome.com.tw/upload/images/20210914/20140592LUq2EJfc43.png

  • python 中 linked list vs. list vs. array

    • linked list 通常是自己宣告节点需要哪些资料,若你希望你的 linked list 可以具备往上一个 Node 跳的功能,那你也可以在 class 新增一个 pre,专门指向前一个 Node,形成 doubly linked link。

      # 宣告一个结构
      class ListNode:
          def __init__(self, val=0, next=None):
              self.val = val
              self.next = next
      
      # 宣告一个命名为 linked_data 的 ListNode class 结构的资料 
      linked_data = ListNode()
      
      
    • list

      • 我们平常使用的 List 结构,就会跟记忆体要一连串的位址,如图 0x310718~0x3106e8 位址,每个位址会储存真正的,指向真正储存的值的位址,假设读取 list 最後一个位址 (0x3106e8),他会导向真正储存值的地方,找到我们储存的资料

        https://ithelp.ithome.com.tw/upload/images/20210914/20140592ouypsw9QjH.png

      • 有人就会有疑问了,为什麽不直接把资料储存在跟记忆体要的空间,而是还要储存一个位置,导向真正的资料位置,list 这样设计的好处是,他是储存「真正一笔资料的位址」,所以资料可以不限制类型,可以是字串、数字...,储存的不同类型资料会额外分配空间,而list 只要记录地址就可以,这样我们一开始分配 list 空间的时候,就不会忽大忽小,不过也是因为导向的关系,所以 List 效率会比较低

      • 切记,若我们想将 list 中间把资料砍掉,例如 0x310700 的值不要了,那麽 0x3106b8~0x3106e8 就会向前递补,0x310700~0x3106d0 就会储存新导向的地方

    • numpy array (额外使用 numpy library)

      • 跟记忆体要一段空间,空间直接储存资料,array 中,只能储存相同型态的资料

        https://ithelp.ithome.com.tw/upload/images/20210914/20140592BlwlEjF9nW.png

图片来自 https://medium.com/@t0915290092/如何解决-pandas-效率缓慢的问题-7466b3e996df

Q2. 所以学会 linked list 概念可以做什麽 ?

  • 由於新增跟删除很快,不需要将後面的资料逐渐递补,所以在追求效率新增、删除资料上,可以使用 linked list 的概念

Lab. 明天要分析的题目: 24. Swap Nodes in Pairs

题目连结:https://leetcode.com/problems/swap-nodes-in-pairs/

题目叙述:

  • 你必须改变两两相邻节点的位置,例如 [1,2,3,4] 你必须改成 [2,1,4,3]
  • 必须改变位置,不能改变 val 值

https://ithelp.ithome.com.tw/upload/images/20210914/20140592Tmv2W3oacg.png

测资的 Input/Output:

  • input 你会得到 linked list 的头 (你可以直接 .val 或是 .next 看下一个点)

  • 你必须回传一个交换过的 linked list 的头

    https://ithelp.ithome.com.tw/upload/images/20210914/20140592FviIbUNM7e.png

题目的条件:

  • node 会有 0~100个

  • 每个 node 的 val 会介於 0~100

    https://ithelp.ithome.com.tw/upload/images/20210914/20140592GcPGCqz9fh.png

  • 看完题目,你要思考:

    • 若 input 为 [1,2,3] 那麽 output 预设为 [2,1,3] 还是 [1,3,2] ?

<<:  Day13 在图表做标记仿前朝的飘逸 就当我为highlight你伏笔

>>:  Laravel ChunkById

Ray Dalio 的浅白经济学笔记

今天来笔记一个之前从股癌上看到由 Ray Dalio 分享的一段 30 分钟的浅白经济学的影片。 ...

Day9 You have to trust that the dots will somehow connect in your future

Plotting regression line 继昨天画出XY关系图後,我们就会进一去想知道XY...

[Day08] - 弹跳视窗 Modal - Slot 介绍

网页元件中 , 常会使用 Modal 这种类型的元件 如果我们将其制作成一个 <Modal&g...

[Java Day02] 我的第一支Java程序 & 程序卡与范例档的使用

相关档案网址 https://coding104.blogspot.com/p/java.html ...

【Day 11】设置与调整 AWS Developer Tool - CodeBuild

tags: 铁人赛 CodeBuild AWS 前言 关於 Developer Tool - Cod...