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

Leetcode206. 反转链表

时间:2023-10-17 20:35:24浏览次数:42  
标签:pre ListNode cur 反转 next 链表 Leetcode206 null 节点

题目描述

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

示例

image

提交的代码

class Solution {

    public ListNode resultHead;

    public ListNode reverseList(ListNode head) {
        if(head==null)return null;
        ListNode first=recursionOfList(head);
        first.next=null;
        return resultHead;
    }

    public ListNode recursionOfList(ListNode node){
        ListNode returnedNode=null;
        if(node.next!=null){
            returnedNode=recursionOfList(node.next);
        }
        if(node.next==null){
            resultHead=node;
            return node;
        }

        returnedNode.next=node;
        return node;
    }
}

使用递归的方法来实现反转。
递归到最后一个节点以后,返回当前节点给倒数第二个节点,并让返回的节点next指向倒数第二个节点,一直往上递归,这里需要记住将最后一个节点的地址记录,并且递归结束以后要将最后一个节点的next置为null,不然会出现循环的情况。

学习到的方法

image
双指针法遍历(虽然有三个指针,但是重点是前两个),直接让cur的next指向pre,需要注意的是需要再设置一个next指针指向cur的下一个节点,因为cur的next是会改变的,遍历题目给出的链表需要记录它。
代码为:

class Solution {

    public ListNode reverseList(ListNode head) {
        if(head==null)return null;
        ListNode pre=null;
        ListNode cur=head;
        ListNode nextNode;
        while(cur!=null){
            nextNode=cur.next;
            cur.next=pre;
            pre=cur;
            cur=nextNode;
        }
        return pre;
    }
}

另一种队规方法和上面的双指针法一致,虽然我觉得我的方法适合我,但是个人还是用递归实现一下上面的方法,用来加深个人对于递归的理解。
以下为递归实现的双指针法代码:

class Solution {

    ListNode nextNode;

    public ListNode reverseList(ListNode head) {
        return recursionMethod(null,head);
    }

    public ListNode recursionMethod(ListNode pre,ListNode cur){
        if(cur==null)return pre;
        //记录下来当前节点的下一节点,因为当前节点的next待会会改变。
        nextNode=cur.next;
        //当前节点的翻转开始
        cur.next=pre;
        pre=cur;
        cur=nextNode;
        return recursionMethod(pre,cur);
    }
}

其实双指针法之前是知道的,但是太长时间没碰算法了,看到了就想起来了,后悔这段时间为什么不温习一下之前的知识

标签:pre,ListNode,cur,反转,next,链表,Leetcode206,null,节点
From: https://www.cnblogs.com/whitePuPigeon/p/17770587.html

相关文章

  • java链表详解 理论+代码+图示
    1、定义链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的。(即链表是一个个节点组成的,这些节点物理上不连续,但逻辑上连续)一个节点就是一个Node对象。2、链表结构单向、双向;带头、不带头;循环、非循环; 以上情况组......
  • ECS-Centos7登录页面出现Hint: caps lock on,输入大小写字母反了(大小写反转问题)
    问题描述:虚拟机Centos7,输入大小写字母反了,开启capslock的时候变成小写字母了,关闭则变成大写了。。。解决办法:只需要执行:setleds+caps 或 setleds-caps 即可。如图: ......
  • Leetcode707. 设计链表
    题目描述你可以选择使用单链表或者双链表,设计并实现自己的链表。单链表中的节点应该具备两个属性:val和next。val是当前节点的值,next是指向下一个节点的指针/引用。如果是双向链表,则还需要属性prev以指示链表中的上一个节点。假设链表中的所有节点下标从0开始。实现M......
  • 代码随想训练营第三天(Python) | 203.移除链表元素、707.设计链表、206.反转链表
    一、203.移除链表元素关键点:如何删除节点,需要知道删除节点前的节点。1、无虚拟头节点的方法classSolution:defremoveElements(self,head:Optional[ListNode],val:int)->Optional[ListNode]:whilehead!=Noneandhead.val==val:#如果头节点的值......
  • Leetcode203.移除链表元素
    题目描述给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。示例提交的代码/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}......
  • 链表的头插和尾插(数组--链表)
    头插法代码示例publicclassLinkDemo{publicstaticvoidmain(String[]args){//将这个数组按头插的方式插入列表int[]arr={1,2,3,4,5,6,7,8,9};headIndert(arr);}publicstaticvoidheadIndert(int[]arr){Nodeli......
  • 使用链表而不是 stdarg 实现可变参数函数
    Qidi2023.10.150.需要使用可变参数函数的场景常见的场景是类似于printf(char*fmt,...)函数,输入的参数个数和类型都是未知的,此时除了需要...表示可变参数列表,还需要用fmt参数说明参数的个数和类型。还有另一种场景,假设我们要实现一个音频控制功能的程序。在初始设计......
  • C#内存缓存链表BytesListBuffer
    C#自带MemoryStream,可以作为内存缓存使用,用来存储byte[]数据,但是MemoryStream的扩展机制是通过获取整块连续内存来缓存数据,当需要缓存较大数据时,虽然空闲内存可能足够,但是可能找不到足够大的整块连续内存而导致扩展失败产生outofmemory的异常。另外,对于很多缓存场景,重新分配整块......
  • #9134.反转eehniy
    blog题面yinhee去面试Google总裁。面试官给他了一个长度为\(n\)的\(01\)串。面试官给他以下两种操作是的这个序列前\(n-m\)个数字与后\(n-m\)个数字匹配。具体地说就是让\[a_1=a_{m+1}\cdotsa_{n-m}=a_n\]选择其中的一个数,将其反转(即为从\(0\)变成......
  • 面试必刷TOP101:3、链表中的节点每k个一组翻转
    一、题目将给出的链表中的节点每k 个一组翻转,返回翻转后的链表如果链表中的节点数不是k的倍数,将最后剩下的节点保持原样你不能更改节点中的值,只能更改节点本身。二、题解publicclassSolution{/****@paramheadListNode类*@paramkint整型......