链表反转的python多种方法实现

牛客网《剑指offer》系列的链表反转的python实现。

前几天华为实习面试的时候,一个同学就被面试官考到了这个问题。总的来说链表问题还是比较重要的,链表有关的知识也需要好好复习,总结。

题目如图:链表反转的python多种方法实现_第1张图片

对于链表的问题可以自己在纸上绘制一些图形,这可以加深理解,有利于后续实现

(循环实现)

将每一步之后的各个链表的状态表示如下:

假设初始链表:

循环之前各链表的状态:链表反转的python多种方法实现_第2张图片

第一次循环之后的状态:链表反转的python多种方法实现_第3张图片

第二次循环之后的状态:链表反转的python多种方法实现_第4张图片

 

第三次循环之后的状态:链表反转的python多种方法实现_第5张图片

第四次循环之后的状态:链表反转的python多种方法实现_第6张图片

此时cur为空链表,退出while循环。返回newHead链表,即原链表的反转链表。

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    # 返回ListNode
    def ReverseList(self, pHead):
        # write code here
        if pHead == None or pHead.next == None:
            return pHead  
        cur = pHead 
        tmp = None
        newhead = None  
        while cur:  
            tmp = cur.next   
            cur.next = newhead  
            newhead = cur
            cur = tmp  
        return newhead

#  可以修改原链表的话,更简单
class Solution:
    def reverseList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        if not head or not head.next:
            return head
        Node = None
        while head:
            p = head
            head = head.next
            p.next = Node
            Node = p
        return Node
        

(递归实现)

初始链表:

求链表 A->B->C->D 的反转链表, 可以先求 B->C->D 的反转链表 D->C->B,然后将 A 连在B后面就完成了。

这就将原问题转变为求更小的子问题:求 B->C->D 的反转链表 ...... 依次往下转变就行。

我们从最内层开始看链表的各个状态,假设Head链表为传入函数的参数,NewHead 为内层函数向上返回的链表。

最内层状态:

次内层状态:

链表反转的python多种方法实现_第7张图片

倒数第三层链表状态:(这一层第一个图中NewHead指向的是d节点)

链表反转的python多种方法实现_第8张图片

最外层状态:

链表反转的python多种方法实现_第9张图片

函数最外层返回链表NewHead,即原链表pHead的反转。

class Solution:
    # 返回ListNode
    def ReverseList(self, pHead):
        # write code here
        if not pHead or not pHead.next:
            return pHead
        NewHead = self.ReverseList(pHead.next)
        pHead.next.next = pHead
        pHead.next = None
        return NewHead

 

你可能感兴趣的:(经典算法题)