当前位置:   article > 正文

leetcode 亲测有效:单链表反转的原理和python代码实现_链表反转原理

链表反转原理

链表是一种基础的数据结构,也是算法学习的重中之重。其中单链表反转是一个经常会被考察到的知识点。

单链表反转是将一个给定顺序的单链表通过算法转为逆序排列,尽管听起来很简单,但要通过算法实现也并不是非常容易。现在来给大家简单介绍一下单链表反转算法实现的基本原理和python代码实现。

                                       算法基本原理及python代码

1、方法一:三个指针遍历反转

算法思想:使用3个指针遍历单链表,逐个链接点进行反转。

(1)分别用p,q两个指针指定前后两个节点。其中p.next = q

(2)将p指针指向反方向。

(3)将q指针指向p。q.next = p,同时用r代表剩余未反转节点。

(4)将p,q指针同时后移一位,回到步骤(2)的状态。

(5)r指针指向剩余未反转节点。循环执行(3)之后的操作。

  1. # 详细版
  2. def reverse01(head):
  3. if head == None:
  4. return None
  5. # 分别用p,q两个指针指定先后两个节点
  6. p = head
  7. q = head.next
  8. # 将p节点反转,head节点只能指向None
  9. p.next = None
  10. # 当存在多个后续节点时,循环执行
  11. while q:
  12. r = q.next # 用r表示后面未反转节点
  13. q.next = p # q节点反转指向p
  14. p = q
  15. q = r # p,q节点后移一位,循环执行后面的操作
  16. return p
  17. # 精简版
  18. def reverse01(head):
  19. if not head:
  20. return None
  21. p,q,p.next = head,head.next,None
  22. while q:
  23. q.next,p,q = p,q,q.next
  24. return p

2、方法二:尾插法反转

算法思想:固定头节点,然后将后面的节点从前到后依此插入到次节点的位置,最后再将头节点移动到尾部。

  1. # 详细版
  2. def reverse02(head):
  3. # 判断链表的节点个数
  4. if head == None or head.next == None:
  5. return head
  6. p = head.next
  7. # 循环反转
  8. while p.next:
  9. q = p.next
  10. p.next = q.next
  11. q.next = head.next
  12. head.next = q
  13. # 将头节点移动到尾部
  14. p.next = head
  15. head = head.next
  16. p.next.next = None
  17. return head
  18. # 精简版
  19. def reverse02(head):
  20. if not head or not head.next:
  21. return head
  22. p = head.next
  23. while p.next:
  24. q = p.next
  25. p.next,q.next,head.next = q.next,head.next,q
  26. p.next,head,p.next.next = head,head.next,None
  27. return head

3、方法三:递归方式反转

算法思想:把单链表的反转看作头节点head和后续节点head.next之间的反转,循环递归。

è¿éåå¾çæè¿°

è¿éåå¾çæè¿°

è¿éåå¾çæè¿°

è¿éåå¾çæè¿°

  1. def reverse03(head):
  2. if head.next == None:
  3. return head
  4. new_head = reverse03(head.next)
  5. head.next.next = head
  6. head.next = None
  7. return new_head

                                                      leetcode精简代码示例

 单链表的反转逻辑思路比较清晰,因此关于单链表反转重在考查代码的经精简度,而Python可以实现代码的极度简化,如下:

  1. def reverse04(head):
  2. curr,pre = head,None
  3. while curr:
  4. curr.next,pre,curr = pre,curr,curr.next
  5. return pre

                                    leetcode相关算法习题(92.反转链表II)

利用以上算法思想完成leetcode习题:92.反转链表II

习题描述:

反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。

说明:
1 ≤ m ≤ n ≤ 链表长度。

  1. # 算法思想:采用尾插法反转思想(方法二)
  2. # Definition for singly-linked list.
  3. # class ListNode(object):
  4. # def __init__(self, x):
  5. # self.val = x
  6. # self.next = None
  7. class Solution(object):
  8. def reverseBetween(self, head, m, n):
  9. """
  10. :type head: ListNode
  11. :type m: int
  12. :type n: int
  13. :rtype: ListNode
  14. """
  15. root = ListNode(0)
  16. root.next = head
  17. Head = root # 指定一个头部变量(方法二中固定的head)
  18. for i in range(m-1):
  19. Head = Head.next
  20. if Head.next == None:
  21. return head
  22. pre = Head.next
  23. while pre.next and m < n:
  24. curr = pre.next
  25. pre.next = curr.next
  26. curr.next = Head.next
  27. Head.next = curr
  28. m += 1
  29. # 由于m之前的元素不需要反转,因此用root.next代替方法二中的head
  30. return root.next

 

参考网址:https://www.cnblogs.com/mafeng/p/7149980.html

                 https://blog.csdn.net/fx677588/article/details/72357389

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/209437
推荐阅读
相关标签
  

闽ICP备14008679号