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

LeetCode 206. 反转链表

时间:2023-05-05 18:33:06浏览次数:43  
标签:pre head curr 递归 206 链表 ListNode LeetCode 指针

题目链接:LeetCode 206. 反转链表
本题是链表题目中非常重要的一道题目--反转指针。
解题方法有两种:1.双指针法 2. 递归法
首先看双指针法:
快指针总是在慢指针的前面,也就是每次将快指针的节点的next指针更新成指向慢指针,这样不就进行了反转嘛。

完整代码如下:

func reverseList(head *ListNode) *ListNode {
    // 双指针法
    var pre *ListNode //慢指针
    curr:=head  //快指针
    for ;curr!=nil;{  //注意循环退出的条件,一定要反转所有的节点,
        temp:=curr.Next //记录当前节点的下一个节点(即下一个要反转的节点)
        curr.Next = pre  //反转指针
        pre = curr  //慢指针更新为当前节点
        curr = temp  //快指针更新为下一个要反转的节点
    }
    return pre
}

递归法:
本题的递归法与双指针法思路基本一致,按照递归三部曲:递归的参数、递归结束的条件、递归的单层逻辑进行
完整代码如下:

func reverseList(head *ListNode) *ListNode {
    // 递归法
    // var pre *ListNode  和双指针一样的逻辑,递归的参数是pre 和 curr
    //     curr:=head
    return reverse(nil, head)
}

func reverse(pre, head *ListNode)*ListNode{
    if head == nil {   //递归退出的条件
        return pre
    }
    // 递归中,单层的逻辑
    next := head.Next  //记录当前节点的下一个节点(即下一个要反转的节点)
    head.Next = pre  //反转指针
    return reverse(head, next)  //进行递归
}

标签:pre,head,curr,递归,206,链表,ListNode,LeetCode,指针
From: https://www.cnblogs.com/lxing-go/p/17375061.html

相关文章

  • [Leetcode] 0705. 设计哈希集合
    705.设计哈希集合EnglishVersion题目描述不使用任何内建的哈希表库设计一个哈希集合(HashSet)。实现MyHashSet类:voidadd(key)向哈希集合中插入值key。boolcontains(key)返回哈希集合中是否存在这个值key。voidremove(key)将给定值key从哈希集合中删除。如果......
  • LeetCode 203. 移除链表元素
    题目链接:LeetCode203.移除链表元素本题是一个经典的单链表删除元素的题目,主要注意的有两点:如果删除的元素是不是头元素,则直接p.Next=p.Next.Next即可如果删除的元素是头元素,则需要进行单独的处理forhead!=nil&&head.Val==val{head=head.Next}ifh......
  • LeetCode 59. 螺旋矩阵 II
    题目链接:LeetCode59.螺旋矩阵II本题不涉及算法,只是简单的模拟,但是由于边界条件比较多,因此容易出错。分析题干:题目要求按照右、下、左、上、这样的顺序对数组进行填充,填充的值为1~n*n,因此问题的关键就是找到待填充的位置,将其值赋值为i即可。由于填充的顺序是有规律的,因......
  • LeetCode 209. 长度最小的子数组
    题目链接:LeetCode209.长度最小的子数组本题是一个滑动窗口的题,所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。在本题中实现滑动窗口,主要确定如下三点:窗口内是什么?窗口就是满足其和≥target的长度最小的连续子数组。如何移动窗口的起......
  • LeetCode 977. 有序数组的平方
    题目链接:LeetCode977.有序数组的平方本题直接暴力求解就是先求出每个元素平方后的值,再对平方后的值进行排序,双指针解法由于数组其实是有序的,只不过负数平方之后可能成为最大数了。那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。此时可以考虑双指......
  • LeetCode 27. 移除元素 题解
    题目链接:LeetCode27.移除元素本题大意是要对一个数组进行原地删除数值等于val的元素。双指针算法:通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。快指针(p指针):寻找新数组的元素,新数组就是不含有目标元素的数组慢指针(q指针):指向更新新数组下标的位置当......
  • LeetCode 704. 二分查找 题解
    本题考查的就是一个基本的整数二分查找问题对于整数二分,有单调性一定可以二分,没有单调性的有时候也可以二分。算法思想(分为两种方法):查找结果是在左边区间的情况区间被划分为[l,mid]和[mid+1,r]1、确定分界点,mid=q[(l+r)/2]2、判断是否满足是:区间变成[l,mid]因此:r=mid否......
  • LeetCode 1049. 最后一块石头的重量 II
    思路任何时刻,某个石头的重量永远都是若干石头加减运算的绝对值如a-b+c合并石头都是减法,但仍可能出现+运算符,如a-(b-c)=a-b+c任何一种合并方法,最后一个石头的重量都可以表示成一种代数形式,如a+b-c+d+e+f-g不是所有的代数形式都可以转换为一种合并方法,如a+b+c因此......
  • 合并两个排序的链表
    描述输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。 数据范围: 0≤n≤1000,−1000≤节点值≤1000要求:空间复杂度 O(1),时间复杂度 O(n) 如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6} ......
  • [Leetcode] 0697.数组的度
    697.数组的度点击上方标题跳转至leetcode题目描述给定一个非空且只包含非负数的整数数组 nums,数组的度的定义是指数组里任一元素出现频数的最大值。你的任务是在nums中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。 示例1:输入:nums=[1,2,2,3,1]输......