算法与数据结构:数组&链表 理论和面试题

数组Array

数组在内存中的简单示例:

898369ef9b7659406b4886fdb3a9395f-1

插入和删除操作

4ddc7ed61c693cbb7239a3cded1cb759-1

访问时间复杂度为O(1) 插入和删除时间复杂度最差为O(n),最好为O(1),平均为O(n/2)

 

顺序存储的优缺点

 顺序存储时,相邻数据元素的存放地址也相邻(逻辑与物理统一),要求内存中可用存储单元的地址必须是连续的。

优点:存储密度大(=1),存储空间利用率高。

缺点:插入或删除元素时要对其他元素进行挪动。

在存储空间使用的灵活性上,链式存储比顺序存储要高。

链式存储时,邻数据元素可随意存放,但所占存储空间分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针

优点:插入或删除元素时很方便,使用灵活。缺点:存储密度小(<1),存储空间利用率低。

链表Linked List

链表结构

单链表

5a94fd9b32bf934c0adf3364afc73d7e-1

de11e6c2ca9b232f9c707d52f371773f-1

链表的插入

c06c533ce10381582f4689049c5acd9b-1

 

链表的删除

ca47d0019cd0e54ea3463216004c3fe2-1

双链表 Doubly Linked List

既有前驱也有后继,既可以往前走可以往后走,在查询链表元素的时候会更加的方便。

a8a4ba684df4b4b39befdd550db45313-1

9c15832e1f960c4e207c48f20170e8fb-1

面试题

206. Reverse Linked List 链表反转

ffe180e4dad0f413f58b766dd82fd8b6-1

 

Python 3解法

4ff8c66c31b6e12ad48c560112477ae4-1

24.Swap Node in Pairs  链表的两两反转

a44c96148a2eaafa977599081759066c-1

给定一个列表,反转他们相邻的两个列表。如果链表节点数为单数,最后一个节点不进行操作。

Python 3解法

fb25b4e132e53a3ef1368db432f9d310-1

141.Linked List Cycle 判断链表是否存在环结构

c895efd432d38b0cfa4c36d4c961f15e-1

给定一个链表,确定它是否有一个循环。你能在不使用额外空间的情况下解决这个问题吗?

f8c820df90447d50e27a45e90d8b3de5-2-1

思路一:暴力硬做

从head开始,next->next->next->next->……..->next…….一直往下走,看看最后一个是否为Null。

思路二:利用Set判重

将每个节点的地址存进Set里面,每到一个新节点去查找Set里面是否存在。时间复杂度 O(n)。

思路三:快、慢指针

快指针每次走两步,慢指针每次走一步。判断快与慢指针是否会相遇,相遇则有环状结构。时间复杂度 O(n)。

0dc7d387e8341b68508b94e75cabc1d8-1-1

Python 3解法

35b5cea6165338fa1252fa01a89fcac5-1

 

参考摘抄来源:

截图来源:
视频:《算法面试通关40讲》 06丨面试题:反转一个单链表&判断链表是否有环
作者:覃超
链接:https://time.geekbang.org/course/intro/100019701
© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容