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),具体过程如下: 创 ...
随机推荐
- OSX 10.14.2 安装Cocoapods 出现问题的解决方法
今天尝试用 Cocoapods安装个第三方库.. 输入pod install, 发现 command not find. WTF! 估计是升级10.11后Cocoapods被干掉了. 我输入 sudo ...
- 面试官,不要再问我“Java GC垃圾回收机制”了
Java GC垃圾回收几乎是面试必问的JVM问题之一,本篇文章带领大家了解Java GC的底层原理,图文并茂,突破学习及面试瓶颈. 楔子-JVM内存结构补充 在上篇<JVM之内存结构详解> ...
- Flannel的VXLAN模式工作原理
跨主机通信的一个解决方案是Flannel,由CoreOS推出,最早支持的是UDP模式,但是因为性能太差被淘汰了, 过时的UDP模式 相比两台宿主机直接通信,多出了flanneld的处理过程,发出IP包 ...
- git基础命令详解
一些必须要知道的概念 git的三个工作区域:工作目录.暂存区.git仓库. 工作目录:其实就是本地文件磁盘上的文件或目录: 暂存区:是一个文件,保存了下次提交的文件列表信息,一般在git仓库目录中: ...
- Ubuntu和开发板用网线直连ping不通的问题
我装的Ubuntu 18.04双系统,在通过网络加载内核和文件系统那一步一直连接不上,uboot里面ping我的主机IP地址,提示: ping failed; host 192.168.1.111 i ...
- 【javascript 伪协议】小结
[javascript 伪协议] 将javascript代码添加到客户端的方法是把它放置在伪协议说明符javascript:后的URL中.这个特殊的协议类型声明了URL的主体是任意的javascrip ...
- snkrs web端分析,canvas中的fingerpint
snkrs web端分析,canvas中的fingerpint 代码如下 (()=>{ const canvas = document.createElement("canvas&qu ...
- Cocos Creator实现1024游戏,免费提供代码。
效果预览 获取代码 私信或留言. 游戏介绍 ● Github上的代码,不能进行合并操作,修改以后,功能类似2048,空白块赏随机位置,生成2,可以往左.右.上.下滑动,数字会朝着指定方向运动,相 ...
- Spring Boot入门(二):获取配置文件值
本篇博客主要讲解下在Spring Boot中如何获取配置文件的值. 1. 使用yaml配置文件 Spring Boot默认生成的配置文件为application.properties,不过它也支持ya ...
- typescript 入门教程二
ts中面向对象成员修饰符:public , private , protexted(ts官方网站:ts) 在ts中,默认的成员修饰符就是public public:是表示是公开的,在任何地方,都可以调 ...