牛客网《剑指offer》系列的链表反转的python实现。
前几天华为实习面试的时候,一个同学就被面试官考到了这个问题。总的来说链表问题还是比较重要的,链表有关的知识也需要好好复习,总结。
题目如图:
对于链表的问题可以自己在纸上绘制一些图形,这可以加深理解,有利于后续实现
(循环实现)
将每一步之后的各个链表的状态表示如下:
假设初始链表:
循环之前各链表的状态:
第一次循环之后的状态:
第二次循环之后的状态:
第三次循环之后的状态:
第四次循环之后的状态:
此时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 为内层函数向上返回的链表。
最内层状态:
次内层状态:
倒数第三层链表状态:(这一层第一个图中NewHead指向的是d节点)
最外层状态:
函数最外层返回链表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