(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