letecode练习一:数组和队列
一、概念
数组:数组是具有相同的数据类型且按一定次序排列的一组变量的集合体。
队列:链表是一种物理储存单元上非连续、非顺序的储存结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。。
二、优缺点
数组:
优点:使用方便 ,查询效率 比链表高,内存为一连续的区域
缺点:大小固定,不适合动态存储,不方便动态添加
链表:
优点:可动态添加删除 大小可变
缺点:只能通过顺次指针访问,查询效率低
补充:
顺序表的优点:查找方便,适合随机查找
顺序表的缺点:插入、删除操作不方便,因为插入、删除操作会导致大量元素的移动
链接表的优点:插入、删除操作方便,不会导致元素的移动,因为元素增减,只需要调整指针。
顺序表的缺点:查找方便,不适合随机查找
三、常见考题
(一)反转链表:就比如把1—>2->3->4转化为4->3->2->1
法一:从头到尾遍历链表,每到一个新元素时,定义两个指针p和q,p指向当前元素的上一个元素,q指向当前元素的下一个元素。把第一个节点连在第二个节点的后面,并将p和q均向右移动一位
class Solution(object):
def reverseList(self, phead):
p=phead
q=p.next ##p和q分别指代当前节点和下一个节点
p.next=None ##把第一个节点和之后的节点断开
while q: ##从第二次个节点开始
r=q.next ##先保存下一个节点的值
q.next=p ##把第一个节点连在第二个节点的后面
p,q=q,r ##p,q分别往后移
return p
法一的优化(注意:python中多元赋值的时候,右边的值不会随着赋值而改变)
class Solution:
def reverseList(self, head):
pre, cur = None, head
while cur:
cur.next, pre, cur = pre, cur, cur.next
return pre
(二)两两节点进行反转:和链表反转类似,关键在于 有三个指针,分别指向前后和当前节点。不同点是两两交换后,移动节点步长为2
创建三个指针:
pre指向开始交换的节点的上一个节点
at指向需要交换的第一个节点,即head.next
b指向需要交换的第二个节点,即head.next.next
循环链表,通过head不断交换a/b位置即可。
class Solution(object):
def swapPairs(self, head):
pre,pre.next=self,head
while pre.next and pre.next.next:
a=pre.next
b=a.next
pre.next,b.next,a.next=b,a,b.next###把b的位置换成a,b后面连a,a后面重新接b的后面
pre=a
return self.next
(三)给定一个链表,判断链表中是否有环。
思路:定义一个快指针和慢指针,快指针一次走两步,慢指针一次走一步,若两指针能够相遇则存在环,否则不存在环。
class Solution(object):
def hasCycle(self, head):
slow=fast=head
while slow and fast and fast.next:
slow=slow.next
fast=fast.next.next
if slow is fast:
print(‘true’)
return True
return False