首页 > 其他分享 >【反转链表】while循环/递归

【反转链表】while循环/递归

时间:2023-12-13 21:25:02浏览次数:33  
标签:head ListNode val 递归 next 链表 while null

leetcode 206. 反转链表

题意:给定链表表头,反转链表,返回反转链表的表头

【循环】题解:

head维护原链表当前节点,nHead维护反转链表的头节点,nHead置于head前一位,依次后移,直至head到链表尾结束。

双指针循环版本
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        if(head == null) return null;
        ListNode nHead = new ListNode(head.val, null);
        while(head.next != null) {
            head = head.next;
            nHead = new ListNode(head.val, nHead);
        }
        return nHead;
    }
}

【双指针递归】题解:

一句话总结:每次递归都返回原链表[表头至当前节点]子链表的反转链表的表头!

定义递归函数ListNode reverse(ListNode head, ListNode lastNewHead),

  • head:表示原链表的当前节点
  • lastNewHead:表示反转链表的当前节点
    在原链表中,lastNewHead位于head之前,如下图:

每次迭代更新反转链表的头节点nHead = ListNode(head.val, lastNewHead)
递归:往后移动head和lastNewHead
递归结束标志:遍历到原链表链尾,此时返回反转链表的头节点

双指针递归版本
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        if(head == null) return null;
        return reverse(head, null);
    }

    public ListNode reverse(ListNode head, ListNode lastNewHead) {
        ListNode nHead = new ListNode(head.val, lastNewHead);
        if(head.next == null) return nHead;
        return reverse(head.next, nHead);
    }
}

【递归妙解】题解2:

一句话总结:每次递归返回原链表[当前节点至链表尾]的局部反转链表的表头!

如下图,原链表的4、5节点已经被反转完成,当前节点为head=3,继续添加3节点至反转链表中,就是使反转链表表头head.next=4的next节点为head=3即可,也就是head.next.next = head,注意:必须保证原链表表头在反转链表中的next为null!

妙解!!
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        if(head == null || head.next == null) return head;
        ListNode res = reverseList(head.next);
        head.next.next = head;
        head.next = null;
        return res;
    }
}

标签:head,ListNode,val,递归,next,链表,while,null
From: https://www.cnblogs.com/Eve7Xu/p/17899220.html

相关文章

  • 数据结构:双链表
    由于双链表中大部分操作其实和单链表操作类似,所以这里只挑关键的一些函数1、定义与初始化typedefstructDNode{ElementTypedata;structDNode*prior,*next;}DNode,*DLinkList;boolInitialDLinkList(DLinkList&L){L=(DNode*)malloc(sizeof(DNode));......
  • Python:递归函数
    一、函数的递归什么是函数的递归:函数的递归就是函数的递归调用:是函数嵌套调用的一种形式。具体是指:在调用一个函数的过程中又直接或者间接的调用到本身。#1、直接调用本身(简单理解为死循环)deff1():print('直接调用本身实例:')f1()#调用f1()#由于没有......
  • 学C笔记归纳 第十三篇——函数3 递归(重点)
    1.什么叫递归?    递归是一种编程技巧,程序调用自身的编程技巧称为“递归”,应用广泛。2.描述递归    递归把一个大型复杂问题层层转化为一个与原问题相似的规模较小的问题来求解,    只需要少量的程序就可以描述出解题过程所需要的多次重复计算,大大减少......
  • simpread-Ubuntu 扩容磁盘、扩容内存_ubuntu 扩容 the file system can not be resize
    原文地址blog.csdn.net参考:Ubuntu磁盘扩容及启动问题整理作者:一只青木呀发布时间:2020-12-0810:42:19网址:https://blog.csdn.net/weixin_45309916/article/details/110850358也可参照正点原子的:Ubuntu磁盘空间不足?一招轻松扩容Ubuntu磁盘扩容(简单亲测有效)Ubuntu......
  • 【交叉链表】Java哈希表——HashSet类/双指针
    leetcode160.相交链表题意:给定两个链表A、B的表头节点,找到链表交叉节点(地址值相同)。链表A长度为m,链表B长度为n,范围在[1,3e4]题解1:根据哈希表去重的原理,使用哈希表集合HashSet来维护链表节点,默认比较节点地址值。将链表A中的节点全部add进HashSet中,然后遍历链表B中的节点,如果......
  • 2023/12/10 链表
    #include<iostream>usingnamespacestd;typedefintElemType;//自定义链表数据元素为整数structLNode{ElemTypedata;LNode*next;};//初始化链表,返回值:失败返回nullptr,成功返回头结点地址LNode*InitList(){LNode*head=newLNode;//分配头结点......
  • 基于DAMON的LRU链表排序 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/admin-guide/mm/damon/lru_sort.htmlDAMON-basedLRU-listsSortingDAMON-basedLRU-listsSorting(DAMON_LRU_SORT)是一个静态内核模块,旨在用于基于主动和轻量级数据访问模式的(去)优先级排序,以使LRU列表成为更可信赖的数据访问模式源......
  • [LeetCode] LeetCode92. 反转链表II
    题目描述思路:同LeetCode25.K个一组翻转链表因为涉及到可能链表的头节点会改变,所以设置dummy节点先走left-1步到达left的左边一个节点查看后面是否存在right-left+1个节点先翻转内部节点指向right-left次再翻转外部节点方法一:/***Definitionforsingly-lin......
  • [刷题技巧] 链表刷题技巧汇总
    链表的算法题中很常见的技巧:添加虚拟头结点,即dummy结点。当需要创造一条新链表的时候,可以使用虚拟头节点简化边界情况的处理。例如:LeetCode21.合并两个有序链表,让两条有序链表合并成一条新的有序链表,需要创造一条新的链表。例如,LeetCode86.分隔链表,把一条链表分解成两条链......
  • 如何判断链表是否存在环?
    大家好,今天我们来聊一聊如何判断链表是否存在环。如果你是一个链表的小白,听到“环”这个词可能会感到一头雾水。别担心,我会用通俗易懂的语言来解释这个问题,并带大家看一段代码演示。首先,我们要了解什么是链表。链表是一种数据结构,由一系列节点组成,每个节点都有一个值和一个指向下一......