python单向链表逆序_【《Python程序员面试算法宝典》分享】1.1如何实现链表的逆序...

(PS:题外话:本人目前研二DL小硕,目前状态是实验室DL项目(包括论文撰写)和找工作笔试面试准备。目标是算法岗,所以先刷题吧。最近出了一本书:《Python程序员面试算法宝典》,初读感觉不错,每个具体问题都会给出几种解决方案,在这里分享一下学习心得,和大家一起学习!)

1.1如何实现链表的逆序

python中链表结点定义:

class LNode:

def __init__(self, x):

self.value = x

self.next = None

方法一:就地逆序

主要思路:在遍历链表的同时修改当前结点的指针域的指向,指向其前驱结点,需要在遍历的同时保存当前结点,当前结点的前驱结点和后继结点。代码如下:

def reverse_order(head):

node_pre = head # 前驱结点

node_now = head.next # 当前结点

node_next = node_now.next # 后继结点

while node_next:

if node_now != head.next:

node_now.next = node_pre

else:

node_now.next = None

node_pre = node_now

node_now = node_next

node_next = node_next.next

node_now.next = node_pre

head.next = node_now

return head

方法二:递归法

主要思路:和汉诺塔这种经典的递归算法类似,什么是递归?递归就是将原始问题不停地划分为更小的问题去解决,这是一种非常重要的算法思想,它的优点就是算法思路清晰,但是往往伴随着较大的计算资源需求。在这个问题上,比如原链表为(1->2->3->4->5),递归的主要思路为:先逆序除第一个结点以外的子链表(将1->2->3->4->5变为1->5->4->3->2),接着将1添加到逆序子链表的后面(1->5->4->3->2变为5->4->3->2->1),在逆序子链表2->3->4->5时同理。代码如下:

# 方法二:递归法(时间复杂度:O(n) 空间复杂度:O(1)) 性能有所下降

def reverse_recursive(head):

if not head or not head.next:

return head

else:

new_head = reverse_recursive(head.next)

head.next.next = head

head.next = None

return new_head

def recursive_main(head):

if not head or not head.next:

return

else:

first_node = head.next

new_head = reverse_recursive(first_node)

head.next = new_head

return new_head

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值