206. Reverse Linked List [easy] (Python)

这篇博客详细介绍了LeetCode中的206题,即如何翻转一个单向链表。提供了三种不同的解题思路,包括使用栈结构、原链表操作的迭代法和递归法,并给出了相应的Python代码实现。适合Python初学者和正在刷LeetCode的开发者参考。

题目链接

https://leetcode.com/problems/reverse-linked-list/

题目原文

Reverse a singly linked list.

题目翻译

翻转单向链表

思路方法

这个题目比较基础,解法非常多,能AC的解法也很多,这里只整理部分思路以供参考。

思路一

利用栈结构,将链表内容依次压入栈,再从栈依次弹出即可构造逆序。下面的代码用普通数组模拟栈。

代码

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

class Solution(object):
    def reverseList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        p = head
        newList = []
        while p:
            newList.insert(0, p.val)
            p = p.next

        p = head
        for v in newList:
            p.val = v
            p = p.next
        return head

思路二

与思路一栈的思想类似,不过是直接在原链表操作,通过迭代将节点重组,前面的节点转移到重组链表的后面。实际上就是头结点倒插操作。

代码

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

class Solution(object):
    def reverseList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        new_head = None
        while head:
            p = head
            head = head.next
            p.next = new_head
            new_head = p
        return new_head

思路三

递归,注意终止条件

代码

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

class Solution(object):
    def reverseList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        if not head or not head.next:
            return head

        p = head.next
        n = self.reverseList(p)

        head.next = None
        p.next = head
        return n

PS: 新手刷LeetCode,新手写博客,写错了或者写的不清楚还请帮忙指出,谢谢!
转载请注明:http://blog.youkuaiyun.com/coder_orz/article/details/51306170

<think>首先,用户的问题是关于Python列表的list.reverse()方法的。用户询问使用方法、示例、注意事项等。 从系统级指令: - 所有行内数学表达式必须使用$...$格式,但这个问题是关于Python编程的,可能不涉及数学表达式,所以我可以忽略这条。 - 独立公式使用$$...$$,同样,这里可能不适用。 - LaTeX语法正确:确保任何数学部分正确。 - 使用中文回答。 - 生成相关问题:在回答末尾生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识:参考提供的引用,[1]到[4],我需要合理地引用它们。 提供的引用: - [1]:讨论list.sort和sorted,不是直接关于reverse。 - [2]:关于sorted,显示链式调用。 - [3]:关于sort()降序排序。 - [4]:直接比较sort(reverse=True)和列表.reverse的区别。这正是用户问的!所以这个引用最相关。 用户的需求:用户说“我想查找Python中列表list.reverse()方法的相关信息”,并提到“参考站内引用”,但强调“上述引用仅供参考,并不是用户真正的需求”,我需要参考用户上一次的问题和我的回答。但在这个对话中,用户上一次是系统指令,没有具体问题。等一下,对话历史: - 第一个消息是系统指令。 - 第二个消息是用户提供引用和当前问题。 用户说:“请尽可能多的参考用户上一次的问题和你的回答。” 但在第一次互动中,我没有先前的回答。系统指令是我的初始响应,但它是通用的。用户可能在指代引用。 关键是:我的回答要基于提供的引用,尤其是[4],它直接讨论了list.reverse()。 结构化回答: - 结构清晰,帮助用户逐步解决问题。 - 内容:解释list.reverse()方法的使用方法、示例、注意事项。 - 引用:自然地添加引用标识,比如在解释时引用[4]。 大纲回答: 1. **介绍list.reverse()方法**:解释它是什么,做什么。 2. **使用方法**:描述语法,参数。 3. **示例**:提供代码示例演示reverse()。 4. **注意事项**:讨论它是否修改原列表、返回值等。 5. **与sort(reverse=True)的区别**:引用[4]。 6. **生成相关问题**:在末尾添加相关问题。 引用[4]说: - sort(reverse=True):降序排序,依赖元素值。 - list.reverse():单纯反转顺序,不依赖值,仅按当前位置反转。 - 两者都修改原列表,返回值均为None。 所以,在我的回答中,我可以引用这个。 回答使用中文。 最终回答结构: - 开头简要介绍。 - 分点解释使用方法、示例等。 - 结束时生成相关问题。 相关问题:基于主题,比如其他反转方法、应用场景等。 </think>以下是关于Python列表 `list.reverse()` 方法的详细指南和示例。我将基于您提供的引用(特别是引用[4])并结合Python标准文档,逐步解释使用方法、提供示例代码,并总结注意事项。`list.reverse()` 方法用于直接反转列表中元素的顺序(即第一个元素变成最后一个,以此类推),它修改原列表而不依赖元素的值比较[^4]。这使得它与 `sort(reverse=True)` 有明显区别。回答结构清晰,确保真实可靠。 ### 1. **`list.reverse()` 方法简介** - **作用**:`list.reverse()` 方法将列表中的元素顺序完全反转(原地反转),例如 `[1, 2, 3]` 反转为 `[3, 2, 1]`。它不进行任何排序或值比较,仅仅是改变元素的物理位置[^4]。 - **语法**:`list.reverse()`,不需要任何参数。 - **返回值**:无(即返回 `None`),因为它直接修改原列表。 - **与 `sort(reverse=True)` 的区别**:`sort(reverse=True)` 是降序排序(依赖元素值的大小比较),而 `list.reverse()` 是单纯位置反转(不依赖值)。例如,引用[4]强调:`sort(reverse=True)` 会基于值重新排列元素(如 `[3, 1, 2]` 排序为 `[3, 2, 1]`),而 `list.reverse()` 只是逆序排列(如 `[3, 1, 2]` 反转为 `[2, 1, 3]`)[^4]。 ### 2. **使用方法** - **基本步骤**: 1. 创建一个列表。 2. 调用 `list.reverse()` 方法。 3. 方法会自动修改原列表,反转顺序。 - **参数**:无参数。尝试传递参数(如 `reverse=True`)会引发 `TypeError`,因为这不是 `sort()` 方法。 - **关键点**: - **原位修改**:方法直接改变原列表,而不是返回一个新列表。这与 `sorted()` 函数不同(引用[2]提到 `sorted()` 返回新列表)。 - **无返回值**:调用后返回 `None`,因此不能在链式调用中直接使用(例如,不能像 `sorted()` 那样结合 `join()`)。 ### 3. **示例代码** 以下示例展示了 `list.reverse()` 的常见用法。所有代码都基于Python 3.x 语法。 **示例 1: 基本反转** ```python # 创建一个列表 my_list = [1, 2, 3, 4, 5] print("原列表:", my_list) # 输出: [1, 2, 3, 4, 5] # 使用 reverse() 方法反转列表 my_list.reverse() print("反转后:", my_list) # 输出: [5, 4, 3, 2, 1] ``` **示例 2: 反转字符串列表(不依赖值)** ```python # 创建一个字符串列表 fruits = ["apple", "banana", "cherry"] print("原列表:", fruits) # 输出: ['apple', 'banana', 'cherry'] # 调用 reverse() 方法 fruits.reverse() print("反转后:", fruits) # 输出: ['cherry', 'banana', 'apple'] ``` **示例 3: 与 `sort(reverse=True)` 比较(基于引用[4])** ```python # 创建一个混合数字列表 numbers = [3, 1, 4, 2] # 使用 sort(reverse=True) 降序排序(依赖值比较) numbers.sort(reverse=True) print("降序排序后:", numbers) # 输出: [4, 3, 2, 1](基于值大小) # 重置列表 numbers = [3, 1, 4, 2] # 使用 reverse() 单纯反转 numbers.reverse() print("单纯反转后:", numbers) # 输出: [2, 4, 1, 3](不改变元素相对值,仅逆序位置) ``` 注意:反转顺序取决于原列表的初始排列,引用[4]指出 `list.reverse()` 纯粹基于当前位置,而不是元素的值[^4]。 ### 4. **注意事项** - **原位修改风险**:`list.reverse()` 直接修改原列表,而不是创建新列表。如果你需要保留原列表,请先使用切片复制(例如 `reversed_list = my_list.copy()` 后再调用 `reversed_list.reverse()`)。 - **返回值**:总是返回 `None`,因此不能像 `sorted()`(引用[2]示例)那样用于链式操作。例如,`new_list = my_list.reverse()` 会使 `new_list` 为 `None`,而不是反转后的列表。 - **性能**:时间复杂度为 $O(n)$(n 是列表长度),高效但只适合可变列表。对于元组或不可变序列,需使用 `reversed()` 函数(它返回迭代器,不修改原数据)。 - **与 `reversed()` 函数的区别**:`reversed()` 是内置函数,返回一个反转迭代器(不修改原列表),例如 `reversed_list = list(reversed(my_list))`。而 `list.reverse()` 是列表方法,直接修改原列表。 - **错误处理**:如果列表为空,调用 `reverse()` 不会报错,但也没效果。传递参数(如 `reverse=True`)会引发 `TypeError`,因为它不是 `sort()` 方法(引用[3]展示了 `sort(reverse=True)` 的正确用法)[^3]。 ### 总结 `list.reverse()` 是一个简单高效的方法,用于快速反转列表顺序,适用于需要原地修改的场景,如UI元素的渲染顺序或数据反转处理。它不依赖元素值,仅改变位置,与 `sort(reverse=True)` 有本质区别(引用[4]详细对比了这一点)[^4]。在实际使用中,优先考虑是否需要保留原列表来选择方法。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值