【Leetcode】206-反转链表

本文介绍了如何使用迭代和递归两种方法在Python中反转单链表,提供了Solution类的代码实例,包括链表节点定义和两种解法的详细步骤。
摘要由CSDN通过智能技术生成

题目简述

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例2:
输入:head = [1,2]
输出:[2,1]

示例 3:
输入:head = []
输出:[]

节点数据结构:

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

思路分析

反转链表,可以选用迭代或递归方式完成。

【迭代】

如果问题 可以通过遍历并在遍历中采用重复的步骤最后得到结果的话,可以采用迭代的方式解决。

【递归】

如果问题(1)可以拆解为层层嵌套的相同性质的子问题,即当前问题是采用同样步骤逻辑处理的子问题的结果来求解,子问题同理;(2)这种拆解存在停止条件,即存在最内层子问题不用继续拆解而可以返回结果。则该问题可以采用递归算法解决。

求解过程就像是将问题由外到内逐层放进栈里,直到最内层子问题放进栈内位于栈顶,可求得结果然后出栈,子问题先出栈,当前问题基于已解决的子问题得到结果,逐个出栈的过程就是外层问题逐渐获得结果的过程,直到栈空,求得原问题的结果。

解法一(迭代)
class Solution:
    def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
    	pre = None
    	cur = head
    	while cur:
    		nxt = cur.next # 更改next前需记录原指向
    		cur.next = pre # 更改待处理节点的next指向
    		pre = cur # 移动指针pre
    		cur = nxt # 移动指针cur
    	retrun pre
解法二(递归)

停止条件:链表没有节点或只有一个节点
拆分问题: 当前问题-head应该被链接到已反转的子链表末尾节点(实际上就是原链表的head.next节点)之后,子问题-将以head.next为头节点的子链表反转,返回新的头节点。

class Solution:
    def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
    if not head or not head.next:
    	    return head
        newhead = self.reverseList(head.next)
        head.next.next = head
        head.next = None
        return newhead
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值