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

LC206. 反转链表

时间:2023-05-18 13:11:08浏览次数:29  
标签:pre head ListNode cur 反转 链表 null LC206

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

 示例:

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

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

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

提示:

  • 链表中节点的数目范围是 [0, 5000]
  • -5000 <= Node.val <= 5000

A:思路:该题属于简单题,看到该题可能突然会有的思路是,反向遍历题目给的链表,并逐步创建一个一个新节点,进而生成一个新的符合题意的链表再返回其头结点,这样做虽可以达到目的,但是复杂度却高了。

  其实拿到链表类的题,我们最应该想到的是:改变指针。那么有了这一想法,该题目就很容易去解决了,只要我们不断的更改相邻两个节点之间的指针的方向,使其变为反方向即可完成反转链表。

  以下是Java代码,仅供参考:

  双指针法



public ListNode reverseList(ListNode head) {
        if(head == null) return head; // 如果head为null,则不需反转,直接返回即可
        ListNode cur = head;
        ListNode pre = null;
        while(cur != null){
            ListNode temp = cur.next; // 用于存储cur的下一个节点,因为cur的next指针要更改方向了
            cur.next = pre; // 更改指针方向
            pre = cur; // pre前移,指向cur
            cur = temp; // cur前移,指向temp
        }
    }


  递归法

public ListNode reverseList(ListNode head) {
        if(head == null) return head;
        return reverse(null, head);
    }
   // 递归函数
public ListNode reverse(ListNode pre, ListNode cur){
        if(cur == null) return pre; // 递归终止条件,当cur == null时,返回pre
        ListNode temp = cur.next; // 因为要改变指针方向,所以要提前存储cur.next
        cur.next = pre; // 改变指针方向
        return reverse(cur, temp); // 等价于:pre = cur, cur = temp
    }

 

标签:pre,head,ListNode,cur,反转,链表,null,LC206
From: https://www.cnblogs.com/fxy0715/p/17411589.html

相关文章

  • 八大常见的数据结构(一)数组、链表、栈、队列
    1、数组数组是用于储存有限个相同类型数据的集合。数组中的各元素的存储是有先后顺序的,它们在内存中按照这个先后顺序连续存放在一起。可通过数组名和下标进行数据的访问和更新。下标从0开始。2、链表链表是一种物理存储单元上非连续、非顺序的存储结构。链表相较于数组,......
  • #yyds干货盘点# LeetCode程序员面试金典:相交链表
    1.简述:给你两个单链表的头节点 headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回null。图示两个链表在节点c1开始相交:题目数据保证整个链式结构中不存在环。注意,函数返回结果后,链表必须保持其原始结构。自定义评测:评测系统的输入......
  • 代码随想录算法训练营第8天 | ● 344.反转字符串 ● 541. 反转字符串II ● 剑指Offer
     第四章 字符串part01  今日任务  ●  344.反转字符串●  541. 反转字符串II●  剑指Offer 05.替换空格●  151.翻转字符串里的单词●  剑指Offer58-II.左旋转字符串  详细布置   344.反转字符串  建议: 本题是字符串基础题目,就是考察......
  • 重新排序链表
     /** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode() : val(0), next(nullptr) {} *     ListNode(int x) : val(x), next(nullptr) {} *     ......
  • LC19. 删除链表的倒数第 N 个结点
    删除链表的倒数第N个结点(中等)Q:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例:示例一:输入:head=[1,2,3,4,5],n=2输出:[1,2,3,5]示例二:输入:head=[1],n=1输出:[]实例三:输入:head=[1,2],n=1输出:[1]A:思路:对于本题来讲,其本质仍为删除链表......
  • (双指针)剑指 Offer 22. 链表中倒数第k个节点
    题目描述:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。    classSolution......
  • 图解LeetCode——234. 回文链表
    一、题目给你一个单链表的头节点head,请你判断该链表是否为回文链表。如果是,返回true;否则,返回false。二、示例2.1>示例1:【输入】head=[1,2,2,1]【输出】true2.2>示例2:【输入】head=[1,2]【输出】false提示:链表中节点数目在范围[1,10^5]内0<=Node.v......
  • 整数反转
    题目描述:输入一个3位自然数,把这个数的百位与个位数对调,输出对调后的自然数输入格式:一行,一个3位自然数输出格式:输出仅一行,对调后的自然数。样例输入:168样例输出:861......
  • 链表排序
    /***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode():val(0),next(nullptr){}*ListNode(intx):val(x),next(nullptr){}*ListNode(intx,ListNode*next):val(x),next(next){}*......
  • Redis数据结构二之SDS和双向链表
    本文首发于公众号:Hunter后端原文链接:Redis数据结构二之SDS和双向链表这一篇笔记介绍一下SDS(simpledynamicstring)和双向链表。以下是本篇笔记目录:SDS常数复杂度获取字符串长度杜绝缓冲区溢出减少修改字符串带来的内存重分配次数二进制安全兼容C字符串函数双向链......