算法日记-链表翻转

文章目录

重温力扣常规算法,记录算法的演变,今天介绍的是链表翻转

场景:

现在有一条单项链表,链表节点存在一个数据和指向下一个节点的指针, 如何将其翻转过来?

输入 100->200->300->400->500

输出 500->400->300->300->100

针对该场景,我们有多种解决方式,这里我们介绍最常见的两种

解法一:迭代

从前往后遍历链表,处理当前节点时,需要将用额外的变量保存当前节点指向前后的节点指针,从而可以方便改变指针指向的具体信息,然后不停地重复该过程。下面我们来具体操作

步骤

1、定义链表节点结构ListNode,包含两个变量val和next

2、我们需要定义两个变量,变量的类型为ListNode,分别存储当前节点前后地指针信息,分别为prev和next,传入头节点

3、将头节点赋值为curr,开始循环处理,将下一个节点指针保存到next变量 next=curr.next

4、将节点指针指向前一个节点prev,curr.next=prev

5、准备处理下一个节点,将curr赋值给prev

6、将下一个节点赋值为curr,接着处理下一个节点

java 复制代码
public static ListNode reserse(ListNode head) {
     ListNode prev = null;
     ListNode next;
     ListNode curr = head;
     while (curr != null){
     	 //将当前节点未改变前 指向下一节点的信息 保存到next变量
         next = curr.next;
         //改变当前节点的指针指向, 将节点指针指向前一个节点prev
         curr.next = prev;
         //节点改变完了,然后把自己变成前一个节点,则将当前节点信息保存到prev变量
         prev = curr;
         //接着将下一节点赋予当前节点,准备处理下一节点
         curr = next;
     }
     //返回头节点
     return prev;
 }

完整代码

下列是完整代码,包含测试代码

java 复制代码
package com.cys.algorithm;

public class ReverseList {

    static class ListNode {
        int val;
        ListNode next;

        public ListNode(int val, ListNode next) {
            this.val = val;
            this.next = next;
        }
    }

    public static ListNode reserse(ListNode head) {
        ListNode prev = null;
        ListNode next;
        ListNode curr = head;
        while (curr != null){
             //将当前节点未改变前 指向下一节点的信息 保存到next变量
	         next = curr.next;
	         //改变当前节点的指针指向, 将节点指针指向前一个节点prev
	         curr.next = prev;
	         //节点改变完了,然后把自己变成前一个节点,则将当前节点信息保存到prev变量
	         prev = curr;
	         //接着将下一节点赋予当前节点,准备处理下一节点
	         curr = next;
        }
        return prev;
    }

    public static void main(String[] args) {
        ListNode node5 = new ListNode(500, null);
        ListNode node4 = new ListNode(400, node5);
        ListNode node3 = new ListNode(300, node4);
        ListNode node2 = new ListNode(200, node3);
        ListNode node1 = new ListNode(100, node2);
        ListNode prev = reserse(node1);
        System.out.println(prev.val);
        System.out.println(prev.next.val);

    }
}

测试代码运行结果

解法二:递归

递归的思路其实就是把一个大问题分成许多个小问题,然后寻找到解决办法以后,再将方法推广到全局。

步骤

1、通过头部节点,不停地遍历,直到next指针指向为null,找到最后一个元素

2、如果遇到最后一个元素,则返回。接着将最后一个元素指向倒数第二个元素,并且将倒数第二个元素的指向替换成null,然后继续返回,以此类推

完整代码

下列是完整代码,包含测试代码

java 复制代码
package com.cys.algorithm;

public class ReverseList {

    static class ListNode {
        int val;
        ListNode next;

        public ListNode(int val, ListNode next) {
            this.val = val;
            this.next = next;
        }
    }

    public static ListNode reserse(ListNode head) {
        if (head == null || head.next == null){
            return head;
        }
        ListNode newHead = reserse1(head.next);
        head.next.next = head;
        head.next = null;
        return newHead;
    }

    public static void main(String[] args) {
        ListNode node5 = new ListNode(500, null);
        ListNode node4 = new ListNode(400, node5);
        ListNode node3 = new ListNode(300, node4);
        ListNode node2 = new ListNode(200, node3);
        ListNode node1 = new ListNode(100, node2);
        ListNode prev = reserse(node1);
        System.out.println(prev.val);
        System.out.println(prev.next.val);

    }
}

测试代码运行结果

相关推荐
字节源流5 小时前
关于maven的依赖下不下来的问题
java·maven
勇闯逆流河5 小时前
【数据结构】堆
c语言·数据结构·算法
pjx9875 小时前
服务间的“握手”:OpenFeign声明式调用与客户端负载均衡
java·运维·spring·负载均衡
prinrf('千寻)6 小时前
MyBatis-Plus 的 updateById 方法不更新 null 值属性的问题
java·开发语言·mybatis
pystraf6 小时前
LG P9844 [ICPC 2021 Nanjing R] Paimon Segment Tree Solution
数据结构·c++·算法·线段树·洛谷
老华带你飞6 小时前
实习记录小程序|基于SSM+Vue的实习记录小程序设计与实现(源码+数据库+文档)
java·数据库·spring boot·小程序·论文·毕设·实习记录小程序
在未来等你7 小时前
互联网大厂Java求职面试:AI与大模型应用集成及云原生挑战
java·微服务·ai·kubernetes·大模型·embedding·spring ai
飞川撸码7 小时前
【LeetCode 热题100】739:每日温度(详细解析)(Go语言版)
算法·leetcode·golang
源码技术栈7 小时前
SaaS基于云计算、大数据的Java云HIS平台信息化系统源码
java·大数据·云计算·云his·his系统·云医院·区域his
编程、小哥哥7 小时前
互联网大厂Java面试:从Spring Boot到微服务架构的技术深挖
java·spring boot·redis·微服务·prometheus·面试技巧