算法日记-链表翻转

文章目录

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

场景:

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

输入 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);

    }
}

测试代码运行结果

相关推荐
数智工坊1 分钟前
周志华《Machine Learning》学习笔记--第六章--支持向量机
笔记·神经网络·学习·算法·机器学习·支持向量机
casual~3 分钟前
【学习记录】
学习·算法
社交怪人5 分钟前
【奇偶ASCII值】信息学奥赛一本通C语言解法(题号1042)
算法
我登哥MVP11 分钟前
Spring Boo从“会用”到“精通”:Spring Boot 入门
java·spring boot·后端·spring·maven·intellij-idea·mybatis
染翰16 分钟前
Java 实现 Git 自动克隆工具,打包成 Windows 独立 EXE(免安装JDK)
java·git·后端
七老板的blog24 分钟前
多阶段 AI 评测流水线架构设计与实践
java·人工智能·spring
小欣加油24 分钟前
leetcode3635 最早完成陆地和水上游乐设施的时间II
数据结构·c++·算法·leetcode
qq_4581482029 分钟前
科大讯飞实时语音识别(rtasr)真实项目踩坑经验总结与手把手教学真实可运行Demo
java·开发语言·websocket·语音识别
创业之路&下一个五年33 分钟前
mvvm中v和vm关系,vm中v和m的关系?
java·开发语言·javascript
阿昌喜欢吃黄桃33 分钟前
Java优质开源AI项目
java·ai·langchain·开源·rag·springai·langchain4j