本题目摘自《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:如何实现链表的逆序的更多相关文章

  1. python经典面试算法题1.4:如何对链表进行重新排序

    本题目摘自<Python程序员面试算法宝典>,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中. 1.4 对链表按照如下要求重新排序 [微软笔试题] 难度系数: ...

  2. python经典面试算法题1.3:如何计算两个单链表所代表的数之和

    本题目摘自<Python程序员面试算法宝典>,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中. 1.2 如何实现链表的逆序 [华为笔试题] 难度系数:⭐⭐⭐ ...

  3. python经典面试算法题1.2:如何从无序链表中移除重复项

    本题目摘自<Python程序员面试算法宝典>,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中. 1.2 如何实现链表的逆序 [蚂蚁金服面试题] 难度系数:⭐⭐ ...

  4. python经典面试算法题4.1:如何找出数组中唯一的重复元素

    本题目摘自<Python程序员面试算法宝典>,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中. [百度面试题] 难度系数:⭐⭐⭐ 考察频率:⭐⭐⭐⭐ 题目描述 ...

  5. C++经典面试算法题

    转自:http://blog.csdn.net/f_r_e_e_x/article/details/50770907 //1.实现strcpy. char* MyStrCpy( char *pDest ...

  6. 2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案

    2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案 1.题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. ...

  7. python 经典排序算法

    python 经典排序算法 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.常见的内部排序算 ...

  8. php最常见最经典的算法题

    1.一群猴子排成一圈,按1,2,…,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫 ...

  9. 合并K个有序数组(链表)【字节跳动面试算法题】

    本题是本人字节跳动一面考的算法题原题是有序数组,一时没想到怎么解决数组的问题,但是如果给的是有序链表数组,则可以用下面的方法解决 可以利用最小堆完成,时间复杂度是O(nklogk),具体过程如下: 创 ...

随机推荐

  1. PCA 算法核心:高维度向量向低维度投影

    Principal Component Analysis:主成分分析 步骤 5 步: 1.去平均值,也就是将向量中每一项都减去各自向量的平均值 2.计算矩阵的方差,协方差,特征值, 3,.把特征值从大 ...

  2. Linux上安装jdk1.8和配置环境变量

    前言 Linux 上安装jdk1.8 和配置环境变量,参考相关文档,本人在此总结,操作归纳如下. 第一步:创建jdk安装目录(该/usr/local/src 目录是空的,最好把我们自己下载的放到这,容 ...

  3. 【Java 基础】你听说过JMX么

    目录 什么是JMX 相关概念 MBean代码示例 MBean本地连接 MBean远程连接 通过Spring发布MBean 消息订阅发布 参考 什么是JMX JMX(Java管理扩展),是一套给应用程序 ...

  4. drf框架中所有视图及用法

    0909自我总结 drf框架中所有视图及用法 一.drf框架中的所有视图类 from django.views import View from rest_framework import views ...

  5. lua行为树设计与实现

    项目需要,之前行为树用的是behaviorDesigner,要改成纯lua的 我先做了一版用递归实现,代码可读性高但是中断机制实现起来比较复杂,而且创建自定义action重写方法时需要调用父类的方法, ...

  6. firefox 实用插件推荐和使用

    1.firefox安装插件 2.firebug 3.Cookie editor 4.Tamper data 5.user agent switcher 6.hackbar 7.httpfox抓包工具 ...

  7. Javascript之傻傻理不清的原型链、prototype、__proto__

    新人学习Javascript,其中的原型链一直是云里雾里,不得要领,查了很多相关资料,觉得这遍讲得最为清晰易懂,特转载分享,共同学习. 1. JavaScript内置对象 所谓的内置对象 指的是:Ja ...

  8. 1、Struts2基本入门

    一.了解了这几个主要的优点,会促使你考虑使用Struts2 : 1.POJO表单及POJO操作 - Struts2 去除掉了Struts框架中的Action Forms部分.在Struts2框架下,你 ...

  9. 《Java并发编程实战》读书笔记-第1章 简介

    并发简史 在早期的计算机中不包含操作系统,从头至尾都只执行一个程序,并且这个程序能访问计算机所有资源.操作系统的出现使得计算机每次能运行多个程序,并且不同的程序都在单独的进程中运行:操作系统为各个独立 ...

  10. 还在重复写空指针检查代码?考虑使用 Optional 吧!

    一.前言 如果要给 Java 所有异常弄个榜单,我会选择将 NullPointerException 放在榜首.这个异常潜伏在代码中,就像个遥控炸弹,不知道什么时候这个按钮会被突然按下(传入 null ...