python经典面试算法题1.1:如何实现链表的逆序
本题目摘自《Python程序员面试算法宝典》,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中。
1.1 如何实现链表的逆序
【腾讯笔试题】
难度系数:⭐⭐⭐
考察频率:⭐⭐⭐⭐
题目描述:
给定一个带头结点的单链表,请将其逆序。即如果单链表原来为 head -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7,那么逆序后变为 head -> 7 -> 6 -> 5 -> 4 -> 3 -> 2 -> 1。
解答
构造结点类和单链表类
class Node:
def __init__(self, data, next):
self.data = data
self.next = next
class SingleLink:
def __init__(self, head):
self.head = head
方法一:就地逆序(推荐,好理解)
主要思路:在遍历链表的时候,修改当前结点的指针域指向,让它指向它的前驱结点。
时间复杂度:O(n)
def reverse(link: SingleLink):
if link.head is None or link.head.next is None:
return None
cur = link.head.next # cur指向第一个结点
pre = link.head # pre指向头结点
while cur.next is not None: # 如果cur不是最后一个结点
ne = cur.next # ne记住当前结点的下一个结点
if pre != link.head: # 如果cur不是第一个结点
cur.next = pre # 把当前结点的next指向前一个结点
else:
cur.next = None
pre = cur # pre结点后移到当前结点
cur = ne # 当前结点后移一位
ne = ne.next # ne结点后移一位
# cur指向tail了
cur.next = pre # 当cur指向了最后一个结点,循环结束,把最后一个结点指向倒数第二个结点
link.head.next = cur # head指向最后一个结点,即cur
方法二:插入法(推荐,好理解)
主要思路:从链表的第二个结点开始,把遍历到的结点插入到头结点的后面,直到遍历结束。
时间复杂度:O(n)
def reverse2(link: SingleLink):
if link.head is None or link.head.next is None: # 空
return link.head
cur = link.head.next.next # 记住第二个结点
link.head.next.next = None # 第一个结点的指针从指向第二个结点变成None
while cur is not None: # 当第二个结点不是None的时候
next = cur.next # next等于第二个结点的next即第三个结点
cur.next = link.head.next # 第二个结点的next指向第一个结点
link.head.next = cur # head的next也从指向第一个结点变成指向第二个结点
cur = next # cur开始指向第三个结点, 如此循环下去
方法三:递归法(不推荐,算法实现难度大,需要额外的压栈和弹栈,有性能下降)
主要思路:先把除了第一个结点以外的结点逆序,接着把第一个结点添加到子链表的后面。
时间复杂度:O(n)
def RecursiveReverse(head):
# 如果链表为空,或者只有一个元素
if head is None or head.next is None:
return head
else:
# 反转后面的结点
newhead = RecursiveReverse(head.next)
# 把当前遍历的结点加到后面结点逆序后链表的尾部
head.next.next = head
head.next = None
return newhead
def Reverse(head):
if head is None:
return
first_node = head.next
newhead = RecursiveReverse(first_node)
# 将头结点指向逆序后链表的第一个结点
head.next = newhead
return newhead
测试
i = 1
tmp = Node(i, None)
head = Node(None, tmp)
while i < 8:
tmp.next = Node(i, None)
tmp = tmp.next
i += 1
print("正序是: ", end="")
cur = head
while cur.next is not None:
cur = cur.next
print(cur.data, end=" ")
print()
link1 = SingleLink(head)
reverse(link1)
print("逆序是: ", end="")
cur = link1.head
while cur.next is not None:
cur = cur.next
print(cur.data, end=" ")
# 输出:
正序是: 1 1 2 3 4 5 6 7
逆序是: 7 6 5 4 3 2 1 1
欢迎小伙伴们加入我创建的python交流群:625988679
python经典面试算法题1.1:如何实现链表的逆序的更多相关文章
- python经典面试算法题1.4:如何对链表进行重新排序
本题目摘自<Python程序员面试算法宝典>,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中. 1.4 对链表按照如下要求重新排序 [微软笔试题] 难度系数: ...
- python经典面试算法题1.3:如何计算两个单链表所代表的数之和
本题目摘自<Python程序员面试算法宝典>,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中. 1.2 如何实现链表的逆序 [华为笔试题] 难度系数:⭐⭐⭐ ...
- python经典面试算法题1.2:如何从无序链表中移除重复项
本题目摘自<Python程序员面试算法宝典>,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中. 1.2 如何实现链表的逆序 [蚂蚁金服面试题] 难度系数:⭐⭐ ...
- python经典面试算法题4.1:如何找出数组中唯一的重复元素
本题目摘自<Python程序员面试算法宝典>,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中. [百度面试题] 难度系数:⭐⭐⭐ 考察频率:⭐⭐⭐⭐ 题目描述 ...
- C++经典面试算法题
转自:http://blog.csdn.net/f_r_e_e_x/article/details/50770907 //1.实现strcpy. char* MyStrCpy( char *pDest ...
- 2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案
2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案 1.题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. ...
- python 经典排序算法
python 经典排序算法 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.常见的内部排序算 ...
- php最常见最经典的算法题
1.一群猴子排成一圈,按1,2,…,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫 ...
- 合并K个有序数组(链表)【字节跳动面试算法题】
本题是本人字节跳动一面考的算法题原题是有序数组,一时没想到怎么解决数组的问题,但是如果给的是有序链表数组,则可以用下面的方法解决 可以利用最小堆完成,时间复杂度是O(nklogk),具体过程如下: 创 ...
随机推荐
- LeetCode_682-Baseball Game
给定一个字符串列表,字符串包含整数,’+’,’D’,’C’,整数代表一个分数,’+’代表后两个有效分数的和,’D’代表后一个有效分数的两倍,’C’代表删除后一个有效的分数值,最后求所有有效分数的和.例 ...
- Kubernetes之Flannel介绍
Flannel是CoreOS团队针对Kubernetes设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址. 在Kubernetes ...
- Service Cloud 零基础(一)Case 浅谈
本片参考:https://resources.docs.salesforce.com/222/latest/en-us/sfdc/pdf/salesforce_case_implementation_ ...
- PHP绕过disable_function限制(一)
测试环境 php 5.4.5 0x01 利用系统组件绕过 1.window com组件(php 5.4)(高版本扩展要自己添加) (COM组件它最早的设计意图是,跨语言实现程序组件的复用.) 测试: ...
- 运用第一性原理探寻AI本质
摘要:使用第一性原理探讨理解AI本质. 文章来源:宜信技术学院|宜信支付结算团队技术分享第二期-支付结算机器学习技术团队负责人 刘创 分享<AI与第一性原理> 分享者:宜信支付结算机器学习 ...
- cinatra::http框架编译使用
cinatra 一个高效易用的c++ http框架 1.下载源码 https://github.com/qicosmos/cinatra 2. vs2017 编译boost库 [msvc-14.1] ...
- go-结构体和方法
结构体类型的字面量由关键字type.类型名称.关键字struct,以及由花括号包裹的若干字段声明组成. type Person struct { Name string Gender string A ...
- [AHOI2002]网络传输
这道题根据题意,易知k的幂与p的二进制形式有关系,然后再一波高精度即可.(这里我用$n.k$代替了$k.p$) #include <iostream> #include <cstdi ...
- maven的相关操作及常见问题
mvn本地服务nexus3的搭建 下载 下载nexus 官网速度极慢,下面是我下好上传的大家可以下载使用链接:https://pan.baidu.com/s/1Ji5Orv3moXc60HRQ39y6 ...
- SpringBoot学习(二)探究Springboot启动机制
引言: SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏.所以这次博主就跟你们一起探究一下SpringBoot的启动原 ...