美文网首页
Python LeetCode-206.反转链表(难度-简单)

Python LeetCode-206.反转链表(难度-简单)

作者: Jayce_xi | 来源:发表于2019-04-23 11:32 被阅读0次

问题LeetCode链接

1.题目描述

反转一个单链表。

实例
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

2.分析

链表作为比较基础的数据结构,是一定要会的,以下将展示链表的逆序的两种方式。

3.解决

①迭代解决
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        """
        迭代
        """
        if (not head) or head.val==None:  # 避免链表为空的特殊情况
            return head
        
        current_node = head
        pre_node = None  # 定义前一个点
        while current_node:  # 判断条件为当前点是否为None
            next_node = current_node.next          
            current_node.next = pre_node
            
            pre_node = current_node  # 将前一个点定义为当前点
            head = pre_node       # 可以直接return pre_node,这么写是比较好理解
            current_node = next_node  # 定义下一个循环的当前节点为下一个节点
            
        return head

迭代的蛇皮走位写法,可能会有点晕

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        """
        迭代之蛇皮走位写法
        """
        current_node,pre_node = head,None

        while current_node:
            # 主要是利用了python的一个特性,在交换值的时候(以下式子),左边的值是暂时不变的    
            pre_node,current_node.next,current_node = current_node,pre_node,current_node.next
            
        return pre_node
②递归解决

递归这个很不好理解,可以参考这篇博客:
dashuai的博客-全面分析再动手的习惯:链表的反转问题(递归和非递归方式)

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        """
        递归的写法
        递归重要的是你要学会倒着考虑问题
        """
        if not head or head.next == None:  # 递归终止条件(以及排除特殊值问题)
            return head

        else:
            newhead = self.reverseList(head.next)  # newhead一直是指向最后一个节点
            head.next.next = head
            head.next = None   # 仅仅在第一个元素时候起作用(递归就是一个栈,后进先出,所以先考虑末尾,最后考虑头) 
        return newhead

相关文章

  • Python LeetCode-206.反转链表(难度-简单)

    问题LeetCode链接 1.题目描述 反转一个单链表。 实例输入: 1->2->3->4->5->NULL输出:...

  • Leetcode-206.反转链表

    反转一个单链表。 进阶:你可以迭代或递归地反转链表。你能否用两种方法解决这道题?首先指针H迭代到底如下图所示,并且...

  • leetcode-206. 反转链表

    背景 解决方案 第一种解决方案 直接反转 //这种方式是错误的方法。 第二种解决办法 利用递归来实现 递归理解起...

  • 【leetCode】92. Reverse Linked Lis

    关键字:反转部分链表 难度:Medium 题目大意:反转部分链表,要求遍历一次链表完成 题目: 解题思路: 先建立...

  • Python实现双向链表

    Python实现双向链表的增删改查,反转链表

  • leetcode 206. 反转链表

    题目描述 反转一个单链表。相关话题: 链表   难度: 简单 示例:输入: 1->2->3->4->5->NULL...

  • 实战高频leetcode题目

    1. 反转链表 : 反转链表是常见简单题目,定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点...

  • 206. 反转链表(Python)

    题目 难度:★★☆☆☆类型:链表 反转一个单链表。 进阶:你可以迭代或递归地反转链表。你能否用两种方法解决这道题?...

  • leetcode 92. 反转链表 II

    题目描述 反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。相关话题: 链表   难度: 中等说明:1 ≤ ...

  • LeetCode 每日一题 [55] 反转链表

    LeetCode 反转链表 [简单] 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 来...

网友评论

      本文标题:Python LeetCode-206.反转链表(难度-简单)

      本文链接:https://www.haomeiwen.com/subject/hfbmgqtx.html