当前位置:   article > 正文

LeetCode-Python-206. 反转链表_为什么head=head.next是迭代吗

为什么head=head.next是迭代吗

反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 第一种思路:

递归,假设我们已经得到了把head.next翻转完成的结果,p指向这个结果的头,

head的next指针此时指向这个结果的最后一个节点,即head.next

为了将head也翻转,我们需要让head.next的next指针指向head,然后把head的next置空,

最后返回p即可。

  1. # Definition for singly-linked list.
  2. # class ListNode(object):
  3. # def __init__(self, x):
  4. # self.val = x
  5. # self.next = None
  6. class Solution(object):
  7. def reverseList(self, head):
  8. """
  9. :type head: ListNode
  10. :rtype: ListNode
  11. """
  12. if not head or not head.next:
  13. return head
  14. p = self.reverseList(head.next)
  15. head.next.next = head
  16. head.next = None
  17. return p

第二种思路:

利用栈先进后出的性质。

将所有节点压入栈,然后逐个弹出连接next指针。

  1. class Solution(object):
  2. def reverseList(self, head):
  3. """
  4. :type head: ListNode
  5. :rtype: ListNode
  6. """
  7. if not head or not head.next:
  8. return head
  9. stack = []
  10. p = head
  11. while p:
  12. stack.append(p)
  13. p = p.next
  14. newhead = stack[-1]
  15. p = newhead
  16. stack.pop()
  17. while stack:
  18. p.next = stack.pop()
  19. p = p.next
  20. p.next = None
  21. return newhead

第三种思路:

迭代法。

  1. class Solution(object):
  2. def reverseList(self, head):
  3. """
  4. :type head: ListNode
  5. :rtype: ListNode
  6. """
  7. if not head or not head.next:
  8. return head
  9. pre, cur = None, head
  10. while cur:
  11. tmp = cur.next #保存尾部
  12. cur.next = pre #逆转局部
  13. pre = cur #pre后移
  14. cur = tmp #cur后移
  15. return pre

 

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

闽ICP备14008679号