【剑指offer】15.反转链表[by Python]

题目如图:

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

(循环实现)

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

假设初始链表:

循环之前各链表的状态:

第一次循环之后的状态:

第二次循环之后的状态:

 

第三次循环之后的状态:

第四次循环之后的状态:

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


 
 
  1. # -*- coding:utf-8 -*-
  2. # class ListNode:
  3. # def __init__(self, x):
  4. # self.val = x
  5. # self.next = None
  6. class Solution:
  7. # 返回ListNode
  8. def ReverseList(self, pHead):
  9. # write code here
  10. if pHead == None or pHead.next == None:
  11. return pHead
  12. cur = pHead
  13. tmp = None
  14. newhead = None
  15. while cur:
  16. tmp = cur.next
  17. cur.next = newhead
  18. newhead = cur
  19. cur = tmp
  20. return newhead
  21. # 可以修改原链表的话,更简单
  22. class Solution:
  23. def reverseList(self, head):
  24. """
  25. :type head: ListNode
  26. :rtype: ListNode
  27. """
  28. if not head or not head.next:
  29. return head
  30. Node = None
  31. while head:
  32. p = head
  33. head = head.next
  34. p.next = Node
  35. Node = p
  36. return Node

(递归实现)

初始链表:

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

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

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

最内层状态:

次内层状态:

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

最外层状态:

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


 
 
  1. class Solution:
  2. # 返回ListNode
  3. def ReverseList(self, pHead):
  4. # write code here
  5. if not pHead or not pHead.next:
  6. return pHead
  7. NewHead = self.ReverseList(pHead.next)
  8. pHead.next.next = pHead
  9. pHead.next = None
  10. return NewHead

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值