【《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
    原文作者:RainMoun
    原文地址: https://blog.csdn.net/qq_27667937/article/details/84314055
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞