letecode练习一:数组和队列

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值