首页 > 其他分享 >206. 反转链表

206. 反转链表

时间:2023-01-03 11:26:15浏览次数:38  
标签:head 206 反转 self None next 链表 tail

题目链接

https://leetcode.cn/problems/reverse-linked-list/description/

解题思路

按照我们解递归的一般思路,首先确定参数和返回值。

从题意可以看出,参数是给定一个链表的头结点,返回值是一个逆序的链表。

然后,缩小问题规模的方式,在链表中,肯定就是处理当前结点,把后续结点交给递归函数处理。

然后,我们确定本层要做什么。既然递归函数的返回值是逆序好的链表,那本层需要做的事情就是,将本层的结点接在逆序好的链表的末尾。

最后,我们判断一下递归出口。如果本层只剩下一个结点,或者本层直接就是None, 那么直接返回本层即可。

代码1

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
class Solution:
    def reverseList(self, head):
        if head is None or head.next is None:
            return head
        last = self.reverseList(head.next)
        tail = last
        while tail:
            if tail.next is None:
                break
            tail = tail.next
        tail.next = head
        head.next = None
        return last

代码2

 

class Solution:
    def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
        if head is None or head.next is None:
            return head
        next_head = self.reverseList(head.next)
        head.next.next = head
        head.next = None
        return next_head

 

这两种实现有什么不同呢?在于我们找到head该接在哪里的方式不同。

代码1是完全践行了递归程序设计,把reverseList的返回值当成了完全不相干的一个逆序链表,通过遍历的方式找到了最后,然后把head接在了最后。

而代码2,考虑到了实际情况。比如1,2,3,4,5。 逆序之后,对于第一层递归来说,1是1,2,3,4,5在reverseList处理之后是5,4,3,2.

但,此时,1的next还是2. 1的val和next都没有代码去修改,所以当然是2.

所以我们可以直接: head.next.next = head。 这样就将2指向了1.

但此时1的next还指向了2. 即,如果我们从5开始往后遍历,就变成了:5->4->3->2->1->2->1......

所以我们应该让1指向None, 打破这个环。

这就是代码2的情况了。

标签:head,206,反转,self,None,next,链表,tail
From: https://www.cnblogs.com/bjfu-vth/p/17021514.html

相关文章

  • 203. 移除链表元素
    题目链接https://leetcode.cn/problems/remove-linked-list-elements/description/解题思路按照我们解决递归的思路,我们首先想,这个递归函数,应该返回什么,应该定义什么参......
  • 【链表】LeetCode 141. 环形链表
    题目链接141.环形链表思路设置fast指针和slow指针,分别走两步和一步,如果链表有环的话,那么两个指针一定会在某一时刻相遇。可以想象成速度不同的两个人跑圈,只要时间足够......
  • 【链表】LeetCode 160.相交链表
    题目链接160.相交链表思路1先测量两个链表的长度,记录差值k=abs(n1-n2),然后让短的链表先走k步,这样就能保证剩下的长度是一样的,再同步遍历即可。代码1classSolution......
  • 【链表】LeetCode 876.链表的中间结点
    题目链接876.链表的中间结点思路定义两个指针fast和slow,快的指针一次走两步,慢的指针一次走一步,这样当快的指针走到底的时候,慢指针正好在中间。以下两幅图说明了偶数结......
  • 【LeeCode】2443. 反转之后的数字和
    【题目描述】给一个 非负 整数 ​​num​​ 。如果存在某个 非负 整数 ​​k​​​ 满足 ​​k+reverse(k)=num​​​ ,则返回 ​​true​​ ;否则,返回 ​......
  • m基于matlab的超宽带MIMO雷达对目标的检测仿真,考虑时间反转
    1.算法概述(不加时间反转处理)参看框图1:天线阵A发送信号,经过目标场,在接收阵B端接收数据记为Y1,然后对所接收到的信号处理(匹配滤波等处理过程),得到回波的信噪比,目标的位置及成像......
  • m基于matlab的超宽带MIMO雷达对目标的检测仿真,考虑时间反转
    1.算法概述     (不加时间反转处理)参看框图1:天线阵A发送信号,经过目标场,在接收阵B端接收数据记为Y1,然后对所接收到的信号处理(匹配滤波等处理过程),得到回波的信噪比,目标......
  • 每日算法之删除链表中重复的结点
    JZ76删除链表中重复的结点题目给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)例如,给定的二叉树是{1,2,3,#,#,4,5}该二叉树之......
  • 刷刷刷Day2| 142.环形链表II
    142.环形链表IILeetCode题目要求给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪......
  • 刷刷刷Day4|面试题 02.07. 链表相交
    面试题02.07.链表相交LeetCode题目要求给你两个单链表的头节点 headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回null。图示两......