首页 > 编程知识 正文

单链表和数组的区别(区分数组和链表)

时间:2023-05-03 22:56:36 阅读:96965 作者:357

00-1010使用连续的内存空间来存储一组相同数据类型的元素。使用下标访问元素;适合多读少更新(有序状态下删除或添加)的场景。

使用下标访问元素的时间复杂度为O(1)。缺陷占据的空间必须是连续的。扩展容量时,需要将原始数组中的元素移动到新空间。当元素被排序时,在添加或删除元素时需要移动数据。示例(leetcode-1588)给出了一个正整数数组arr。请计算所有可能的奇数子阵列的总和。

子阵列被定义为原始阵列中的连续子序列。

请返回arr中所有奇数长度子阵的和。

输入:arr=[1,4,2,5,3]

产出:58

说明:所有奇数长度的子阵及其和为:

[1]=1

[4]=4

[2]=2

[5]=5

[3]=3

[1,4,2]=7

[4,2,5]=11

[2,5,3]=10

[1,4,2,5,3]=15

我们把所有的值相加,得到1 4 2 5 3 7 11 10 15=58。

def sum(arr):

'''

辅助数组sumArr:的每一项代表数组Arr中前n项元素的总和。

1.遍历数组arr,计算数组前n项之和并写入sumArr(第一项值位0),计算每个元素之和(子数组长度为1)。

2.根据[3,5]的步长.数组长度]范围(3,len(arr),2),计算每个奇数子区间的元素和。

:类型arr:列表[int]

:rtype: int

'''

#保存所有连续奇数子区间数组的总和

总和=0

#数组长度1是为了代码简单,sumArr长度比Arr大1,

#第0个位置的元素值为0;sumar[j]-sumar[j-I]可以在计算奇数子区间值时统一使用,类似于easy发夹效应3360。否则,第一个奇数子区间的写入与后面的写入不同。

l=len(arr) 1

#保存数组arr中前n项的总和

sumArr=[范围(l)中I的0]

# 1.计算arr的前n项之和

#因为单个元素是元素个数为1的子区间,所以遍历时可以直接求和;

对于范围(1,l):中的I

#长度为1的子阵列之和

sum=arr[I-1];

# arr中前n项的总和

sumar[I]=sum

#计算奇数长度的子阵列间隔之和。

#子阵列的最小长度

i=3

而我:

j=I;

#每个子区间的和是sumArr中区间I的两个元素之差。

而j l:

sum=sumArr[j] - sumArr[j - i]

j=1

i=2

返回示意图

00-1010每个元素包含两部分:数据和指针。物理上,它可以连续或不连续存储。除了头节点和尾节点,单个链表中的所有其他节点都有一个前序节点和一个后序节点。从逻辑上讲,它就像一条连接在一起的链条。

优点每个元素占据的空间可以是连续的,也可以是不连续的。向链表头部添加元素的时间复杂度为O(1),所以只要有足够的内存就可以添加任何元素。删除(中间位置)元素时,不需要移动元素,只需将前节点的下一个指针指向待删除节点的后节点即可。缺点:不支持随机访问。访问元素时,只能从节点的开始处开始顺序遍历链表。分类单一链接列表

单向循环链表

双向链表

双向循环链表

例子

输入两个链表,找到它们的第一个公共节点。

类别列表节点(对象):

'''

链表节点

'''

def __init__(self,x):

self.val=x

自我。下一个=无

def getIntersectionNode(self,headA,HedB):

'''

:键入标题1,标题1:列表节点

:rtype:列表节点

'''

#链表的长度

l1=0

#链表A的头节点

hA=headA

#链表的长度

l2=0

#链表B的头节点

hB=headB

#返回值

r=无

#计算链表a的长度。

而hA:

l1=1

hA=hA.next

#计算链表b的长度。

而hB:

l2=1

hB=hB.next

#首先将具有多个节点的链表移动到abs(l1-l2)节点,这样headA和headB的剩余节点数相同

hA=headA

hB=headB

i=0

如果l1 l2:

而i l1 - l2:

hA=hA.next

i=1

else:

而i l2 - l1:

hB=hB.next

i=1

# 查找相同的节点

而哈和hB:

if hA==hB:

r=hA

破裂

else:

hA=hA.next

hB=hB.next

返回r示意图

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。