学习数据结构——链表

一直以来都知道自己在数据结构上是个弱点,大学时期学的东西到现在就只能记得一个概念了,自从期末考完试就都还给老师了。要开始找工作面试了,决定把这些东西都重新温习一遍。

数据结构中最基础的应该就是线性表(线性表:零个或多个数据元素的有限序列)了,线性表根据物理结构的不同分为顺序存储结构和链式存储结构,顺序结构实现就是数组了,链式结构就是链表了。

定义:链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

链表分为单项链表,双向链表和循环链表,一般情况下单项链表居多。推荐看一下J_Knight_在掘金上的文章(末尾有链接,链表要实现节点(Node)和链式结构(List)

节点是链表的基本单元,单项链表节点只有next指针,双向链表包含next和previous两个指针

ADT 节点(node)

Data

 value:持有的数据

Operation

 init:初始化

 previous:指向上一节点的指针

 next:指向下一节点的指针

endADT

链表实现了一些主要的操作功能,如插入节点,删除节点,查询节点等(增删改查)

ADT 链表(linked list)

Data

 linked list:持有的线性表

Operation

 init:初始化

 count:持有节点总个数

 isEmpty:是否为空

 first:头节点

 last:尾节点

 node:传入index返回节点

 insert:插入node到指定index

 insertToHead:插入节点到表头

 appendToTail:插入节点到表尾

 removeAll:移除所有节点

 remove:移除传入的节点

 removeAt:移除传入index的节点

endADT

具体代码就不贴了,J_Knight_在掘金上写的很清楚了,建议自己敲一遍,还是很有作用的,我想分享一下在iOS面试之道上涉及到链表的三道题并记录一下我当时的想法。

question1:给出一个链表和一个值x,要求将链表中所有小于x的值放到左边,大于等于x的值放到右边,并且保证原链表节点的顺序不变,例子:List:1->5->3->2->4->2 x = 3 结果为:1->2->3->5->3->4

解题思路:使用两个链表,一个记录比x小的值,一个记录比x大的值,使用尾插法来保证节点的顺序是不变的,最后将两个链表连接起来。

Dummy节点:它的作用就是作为一个虚拟的头前结点。我们引入它的原因是我们不知道要返回的新链表的头结点是哪一个,它有可能是原链表的第一个节点,可能在原链表的中间,也可能在最后,甚至可能不存在(nil)。

实现代码:


func LinkedListSort(_ head : LinkedList<Int>, _ x : Int) -> LinkedList<Int>{
    let prevDummy = LinkedListNode<Int>(value: 0) , postDummy = LinkedListNode<Int>(value: 0)
    var prev = prevDummy , post = postDummy
    
    var node = head.first
    
    while node != nil {
        if((node?.value)! < x){
            prev.next = node
            prev = node!
        }else{
            post.next = node
            post = node!
        }
        node = node!.next
    }
    
    post.next = nil
    prev.next = postDummy.next
    
    return head
}

question2:如何检测链表中是否有环存在(这道题在去苏宁面试的时候问过的)

解题思路:用两个指针同时访问链表,其中一个的速度是另一个的两倍(快指针和慢指针),如果他们变成相等的,那么链表存在环,反之则链表不存在环(这个理论我思考了很久,不明白为什么快指针一定会和慢指针指向同一个节点,后来想通了,因为有环的链表是不会over的,两个指针一定会指向同一个节点)

实现代码:


func isExistCircle(_ List : LinkedList<Int>) -> Bool{
    let head = List.first
    
    var slow = head
    var fast = head
    
    while fast != nil && fast?.next != nil{
        slow = slow?.next
        fast = fast?.next?.next
        if slow === fast{
            return true
        }
    }
    
    return false
}

Question 3:给出链表和一个值x,要求将链表中倒数第x个节点删掉(链表为一个未知长度的单向链表)

解题思路:使用两个速度相同的指针,快指针领先慢指针x个节点,当快指针到达终点时,慢指针的下一个节点就是我们要删除的节点。(我当时直接用链表里面的size函数获得链表长度,用remove函数删除了对应的节点,但是remove函数是基于双向链表实现的,如果是单项链表的话是不可以直接remove的)

实现代码:

func removeFromEnd(_ List : LinkedList<Int>, _ x : Int ) -> LinkedList<Int>{
    
    let head = List.first
    
    var slow = head
    var fast = head
    
    //设置快指针初始位置
    for _ in 0 ..< x {
        fast = fast?.next
    }
    
    while fast != nil && fast?.next != nil{
        slow = slow?.next
        fast = fast?.next
    }
    
    //List.remove(node: (slow?.next)!)//remove函数是基于双向链表实现的,单项链表无法使用
    slow?.next = slow?.next?.next
    return List
}

链表章节就这三道题了,主要还是学到了dummy节点和快行指针这样的概念,比较有收获。

链接:
J_Knight_掘金地址

iOS面试之道 链表章节内容

iOS面试之道(唐巧,故胤道长)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容

  • C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程...
    小辰带你看世界阅读 1,308评论 0 3
  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 5,745评论 0 13
  • 风是树的信使 带来另一棵树的思念 花香是他的礼物
    张金丹阅读 148评论 0 0
  • 其实早已知道了结果,奈何心却耐不住寂寞,阳春白雪堆积在我和她之间的沟壑,我们所需要的,只是一场风雨。 13年的春节...
    偏爱阅读 254评论 0 1
  • 最近很烦很烦,生活里有太多烦恼充斥,讨厌的人有点多。主要是别人的不友善和势利眼,也许我一直都是没有归属感的,找不到...
    黛如眉阅读 113评论 0 0