反转链表 浅浅的花香味﹌ 2022-05-13 22:45 297阅读 0赞 ## 题目描述 ## 输入一个链表,反转链表后,输出新链表的表头。 链表的数据结构如下: public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } \[**反转链表**\]也叫做\[**链表逆置**\].比如一个链表是这样的:1->2->3->4->5,通过反转后可以变成为5->4->3->2->1。 容易想到的方法遍历一遍链表,利用三个指针,第一个指针P存储反转的节点,第二个指针q存储当前的节点,反转前p-->q,反转后q-->p,第三个指针temp存储q节点的下一个节点用于遍历。代码如下: **第一种方法**遍历求解反转链表问题: public class Solution { public static void main(String[] args) { //构造树结构测试用 ListNode a = new ListNode(1); ListNode b = new ListNode(2); ListNode c = new ListNode(3); ListNode d = new ListNode(4); ListNode e = new ListNode(5); a.next = b; b.next = c; c.next = d; d.next = e; System.out.print("BeforeReverse: "); visit(a); System.out.println(); Long begintime = System.nanoTime(); ListNode f = ReverseList(a); Long endtime = System.nanoTime(); System.out.print("AfterReverse: "); visit(f); System.out.println(); System.out.print("ReverseTime = "+(endtime - begintime)+"ns"); } public static void visit(ListNode p) { while(p!=null) { System.out.print(p.val + " "); p = p.next; } } public static ListNode ReverseList(ListNode head) { ListNode p = null; ListNode q = head; ListNode temp = null; while(q!=null){ temp = q.next; q.next = p; p = q; q = temp; } return p; } } 程序运行的结果: ![70][] 遍历求解反转链表的时间复杂度为**O(n)**。 这个问题也可以使用递归求解。只需要修改ReverseList( )里面的内容就可以,其他的地方不用变。 **第二种方法**递归求解反转链表问题: public static ListNode ReverseList(ListNode head) { //如果链表为空或者链表中只有一个元素 if(head == null || head.next == null) { return head; } else { //先反转后面的链表,走到链表的末端结点 ListNode newhead = ReverseList(head.next); //再将当前节点设置为后面节点的后续节点 head.next.next = head; head.next = null; return newhead; } } 在这里使用递归实现链表的反转是非常巧妙的一种解法,它利用递归走到链表的末端,然后再更新每一个node的next 值 ,实现链表的反转。 这里还是以链表:1->2->3->4->5为例。第一次走到末端时head指向4。 第一步:newhead走向链表的结尾,指向的是链表的最后一个节点,此时head.val = 4,newhead.val = 5; 第二步:head.val = 4,head.next.val = 5,head.next.next = head就实现了链表的反转,把4-->5变为5-->4。 第二步: head.next = null,就是把节点4的下一个节点指向null。 一个节点处理完了再通过递归回溯,此时的head指向的节点的值变成了3。 第一步:newhead就是head的下一个节点,此时head.val = 3,newhead.val = 4; 第二步:head.val = 3,head.next.val = 4,head.next.next = head就实现了链表的反转,把3-->4变为4-->3。 第二步: head.next = null,就是把节点3的下一个节点指向null。 依次类推。到反转的最后一个节点它的下一个节点的值因为设置了 head.next = null语句,可以把它的next指向空。所以整个逻辑是没有问题的。 程序运行结果: ![70 1][] 递归求解反转链表的时间复杂度也是**O(n)**。 [70]: /images/20220514/7154ccb668294443a84fe258aa51a0e1.png [70 1]: /images/20220514/35bc8c0e4a374154abc43a669999b70e.png
相关 反转链表 > [剑指Offer 24 反转链表 \[easy\] ][Offer 24 _ _easy_] > ![在这里插入图片描述][watermark_type_ZmFuZ3p 曾经终败给现在/ 2022年12月27日 01:21/ 0 赞/ 216 阅读
相关 反转链表 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ub 「爱情、让人受尽委屈。」/ 2022年11月29日 12:40/ 0 赞/ 193 阅读
相关 反转链表 / 反转链表 给一条单链表,请反转整个链表,并返回反转后的链表 / public class Test5 { / 这个递归函数的定 àì夳堔傛蜴生んèń/ 2022年10月29日 01:50/ 0 赞/ 240 阅读
相关 反转链表 代码: // by nby \include<iostream> using namespace std; struct node \{ int 以你之姓@/ 2022年08月07日 07:37/ 0 赞/ 234 阅读
相关 反转链表 题目 给定一个常数K以及一个单链表L,请编写程序将L中每K个结点反转。例如:给定L为1→2→3→4→5→6,K为3,则输出应该为3→2→1→6→5→4;如果K为4,则输出 た 入场券/ 2022年07月28日 01:12/ 0 赞/ 241 阅读
相关 链表反转 public class LinkedListReverse { public static void main(String[] args) { £神魔★判官ぃ/ 2022年05月24日 08:05/ 0 赞/ 289 阅读
相关 反转链表 题目描述 输入一个链表,反转链表后,输出新链表的表头。 链表的数据结构如下: public class ListNode { int val; 浅浅的花香味﹌/ 2022年05月13日 22:45/ 0 赞/ 298 阅读
相关 反转链表 [反转链表][Link 1] 题目描述 输入一个链表,反转链表后,输出新链表的表头。 1 public class Solution { 心已赠人/ 2022年03月25日 15:26/ 0 赞/ 266 阅读
相关 反转链表 时间限制:1秒 空间限制:32768K 热度指数:408664 本题知识点: 链表 算法知识视频讲解 题目描述 输入一个链表,反转链表后,输出新链表的表头。 妖狐艹你老母/ 2022年03月10日 01:30/ 0 赞/ 276 阅读
相关 链表反转 include "stdafx.h" include<iostream> include<cmath> using namespace 不念不忘少年蓝@/ 2021年09月12日 02:40/ 0 赞/ 431 阅读
还没有评论,来说两句吧...