24. 反转链表(剑指 Offer 题解Java版,面试常考)

1.理解单链表的反转(java实现)

要求很简单,输入一个链表,反转链表后,输出新链表的表头。
  反转链表是有2种方法(递归法,遍历法)实现的,面试官最爱考察的算法无非是斐波那契数列和单链表反转,递归方法实现链表反转比较优雅,但是对于不了解递归的同学来说还是有理解难度的。

递归法

总体来说,递归法是从最后一个Node开始,在弹栈的过程中将指针顺序置换的。

24. 反转链表(剑指 Offer 题解Java版,面试常考)_第1张图片

为了方便理解,我们以 1->2->3->4这个链表来做演示。输出的效果是4->3->2->1

package 剑指offer.反转链表_24;/*
作者     :XiangLin
创建时间 :15/06/2020 14:49
文件     :ReverseList.java
IDE      :IntelliJ IDEA
*/

public class ReverseList {
    public static class Node{
        int val;
        Node next;

        public Node(int val){
            this.val = val;
        }
    }
    public Node reverse(Node head){
        if (head == null || head.next == null)
            return head;

        Node temp = head.next;
        Node newhead = reverse(head.next);
        temp.next = head;
        head.next = null;
        return newhead;
    }

}

递归实质上就是系统帮你压栈的过程,系统在压栈的时候会保留现场。

我们来看是怎样的一个递归过程:1->2->3->4

  1. 程序到达Node newHead = reverse(head.next);时进入递归
  2. 我们假设此时递归到了3结点,此时head=3结点,temp=3结点.next(实际上是4结点)
  3. 执行Node newHead = reverse(head.next);传入的head.next是4结点,返回的newHead是4结点。
  4. 接下来就是弹栈过程了
  • 程序继续执行 temp.next = head就相当于4->3
  • head.next = null 即把3结点指向4结点的指针断掉。
  • 返回新链表的头结点newHead

注意:当retuen后,系统会恢复2结点压栈时的现场,此时的head=2结点;temp=2结点.next(3结点),再进行上述的操作。最后完成整个链表的翻转。

遍历法

遍历法就是在链表遍历的过程中将指针顺序置换

24. 反转链表(剑指 Offer 题解Java版,面试常考)_第2张图片

package 剑指offer.反转链表_24;/*
作者     :XiangLin
创建时间 :15/06/2020 15:07
文件     :ReverseList1.java
IDE      :IntelliJ IDEA
*/

public class ReverseList1 {
    public static class Node{
        int val;
        Node next;

        public Node(int val){
            this.val = val;
        }
    }
    public static Node reverse(Node node){
        Node pre = null;
        Node next = null;

        while (node != null){
            next = node.next;
            node.next = pre;
            pre = node;
            node = next;
        }
        return pre;
    }
}

依旧是1->2->3->4

准备两个空结点 pre用来保存先前结点、next用来做临时变量
在头结点node遍历的时候此时为1结点

  • next = 1结点.next(2结点)
  • 1结点.next=pre(null)
  • pre = 1结点
  • node = 2结点

进行下一次循环node=2结点

  • next = 2结点.next(3结点)
  • 2结点.next=pre(1结点)=>即完成2->1
  • pre = 2结点
  • node = 3结点
    进行循环…

另外博主收藏这些年来看过或者听过的一些不错的常用的上千本书籍,没准你想找的书就在这里呢,包含了互联网行业大多数书籍和面试经验题目等等。有人工智能系列(常用深度学习框架TensorFlow、pytorch、keras。NLP、机器学习,深度学习等等),大数据系列(Spark,Hadoop,Scala,kafka等),程序员必修系列(C、C++、java、数据结构、linux,设计模式、数据库等等)以下是部分截图

更多文章见本原创微信公众号「五角钱的程序员」,我们一起成长,一起学习。一直纯真着,善良着,温情地热爱生活。关注回复【电子书】即可领取哦

在这里插入图片描述

在这里插入图片描述
给大家推荐一个Github,上面非常非常多的干货:https://github.com/XiangLinPro/IT_book

When you wake up in the morning, set a goal that today you must be better than yesterday. Do it everyday, grow better!
早上醒来时,给自己定个目标今天一定要比昨天好!每天坚持,一定会大有收获!

2020.6.15于城口

你可能感兴趣的:(剑指,Offer,题解)