首页 > 编程语言 >Java面试题:链表-反转链表

Java面试题:链表-反转链表

时间:2023-11-02 20:08:33浏览次数:40  
标签:pre 面试题 ListNode head next 链表 Java 节点

问题描述

给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。

如当输入链表{1,2,3}时,经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。

示例

输入:{1,2,3}

返回值:{3,2,1}

原题地址:https://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca

代码实现

链表节点数据

package com.example.demo;


public class ListNode {
    int val;
    ListNode next = null;

    public ListNode(int val) {
        this.val = val;
    }
}
package com.example.demo;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * @param head ListNode类
     * @return ListNode类
     */
    public ListNode ReverseList(ListNode head) {
        // head为当前节点,如果当前节点为空的话,那就什么也不做,直接返回null;
        if (head == null) {
            return null;
        }

        // 当前节点是head,pre为当前节点的前一节点,next为当前节点的下一节点
        ListNode pre = null;
        ListNode next = null;

        // 需要pre和next的目的是让当前节点从pre->head->next1->next2变成pre<-head next1->next2
        // 即pre让节点可以反转所指方向,但反转之后如果不用next节点保存next1节点的话,此单链表就此断开了
        // 所以需要用到pre和next两个节点
        // 1->2->3->4->5
        // 1<-2<-3 4->5
        while (head != null) {
            //做循环,如果当前节点不为空的话,始终执行此循环,此循环的目的就是让当前节点从指向next到指向pre
            //如此就可以做到反转链表的效果
            //先用next保存head的下一个节点的信息,保证单链表不会因为失去head节点的原next节点而就此断裂
            next = head.next;
            //保存完next,就可以让head从指向next变成指向pre了,代码如下
            head.next = pre;
            //head指向pre后,就继续依次反转下一个节点
            //让pre,head,next依次向后移动一个节点,继续下一次的指针反转
            pre = head;
            head = next;
        }
        //如果head为null的时候,pre就为最后一个节点了,但是链表已经反转完毕,pre就是反转后链表的第一个节点
        //直接输出pre就是我们想要得到的反转后的链表
        return pre;
    }

    // 打印链表
    public static void printNodeList(ListNode head) {
        ListNode current = head;

        while (current != null) {
            System.out.print(current.val + " ");
            current = current.next;
        }
        System.out.println();
    }

    public static void main(String[] args) {
        //{1,2,3}
        ListNode listNode1 = new ListNode(1);
        ListNode listNode2 = new ListNode(2);
        ListNode listNode3 = new ListNode(3);
        listNode1.next = listNode2;
        listNode2.next = listNode3;
        printNodeList(listNode1);

        ListNode listNode = new Solution().ReverseList(listNode1);

        printNodeList(listNode);
    }
}

输出结果

1 2 3 
3 2 1

标签:pre,面试题,ListNode,head,next,链表,Java,节点
From: https://blog.51cto.com/mouday/8154026

相关文章

  • JavaScript 将大数组拆分成多个小数组 循环调用接口
    项目需求:数据列表批量选择提交购物车,一次性提交数据量过大接口会报错,传递的参数是选中数据id的数组。项目运行很久了不做大改动,将提交数据总数限制在2000条以内,每500条走一次接口。思路:1.写一个将大数组拆分多个小数组的方法,arr为大数组,len为要拆分的小数组长度arrGroup(arr,......
  • java开发环境
    java开发环境编译运行过程(1)编译期将.java源文件交给编译器编译成.class字节码文件的过程(2)运行期把编译后的.class字节码文件经过JVM加载并运行.class字节码文件配置环境变量windows10系统下配置JDK环境变量:(1).安装JDK,安装过程中可以自定义安装目录等信息(2)安装完成后,右击......
  • JAVA多线程之线程间的通信方式
    一,介绍本总结我对于JAVA多线程中线程之间的通信方式的理解,主要以代码结合文字的方式来讨论线程间的通信,故摘抄了书中的一些示例代码。 二,线程间的通信方式①同步这里讲的同步是指多个线程通过synchronized关键字这种方式来实现线程间的通信。参考示例:publicclassMyObj......
  • Java面试题2
    Java面试题(第二天)1.重载和重写的区别重载:发生在同一个类中,方法名必须相同,参数类型不同,个数不同,顺序不同,方法返回值和访问修饰符可以不同,发生在编译时期重写:发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父......
  • Java面试题3
    Java面试题(第三天)1.HashMap和HashTable的区别?a.区别多线程环境下,HashTable比HashMap更安全,因为HashTable都加了一个synchronized修饰HashMap允许key和value为null,而HashTable不允许b.HashMap底层实现数组+链表jdk8开始链表高度到8,数组长度超过64,链表转变为红黑树,元素以......
  • Java面试题4
    Java面试题(第四天)1.双亲委派机制双亲委派机制是指当一个类加载器收到一个类加载请求时,该类加载器首先会把请求委派给父类加载器。每个类加载器都是如此,只有在父类加载器在自己的搜索范围内找不到指定类时,子类加载器才会尝试自己去加载。1.当ApplicationClassLoader收到一......
  • Java面试题5
    Java面试题(第五天)1.对线程安全的理解不是线程安全,应该是内存安全,堆是共享内存,可以被所有线程访问当多个线程访问一个对象时,如果不用进行额外的同步控制或其他协调操作,调用这个对象的行为都可以获得正确的结果,我们就说这个对象时线程安全的堆是进程和线程共有的空间,分全局......
  • Java面试题1
    Java面试题(第一天)1.JDK、JRE、JVM三者区别和联系区别:JDK:JavaDevelopmentKit(Java开发环境)JRE:JavaRuntimeEnvironment(Java运行环境)JVM:JavaVirtualMachine(Java虚拟机)联系:.java文件被javac编译成.class文件然后被jvm使用lib类库编译为机器码然后通过jvm映射到操......
  • Java-并发编程-进阶篇
    在上一篇幅中对并发编程进行了简单介绍:并发与并行,进程与线程,以及并发编程的简单代码但是在企业中往往并不能解决实际问题,例如:1.synchronized关键字在企业开发中会大大降低系统的性能2.当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。线程对象......
  • Java数组_03数组执行原理
    1、运行主要用到的三个区: 2、执行原理: ......