算法日记-链表翻转

文章目录

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

场景:

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

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

    }
}

测试代码运行结果

相关推荐
落落落sss5 分钟前
MQ集群
java·服务器·开发语言·后端·elasticsearch·adb·ruby
我救我自己5 分钟前
UE5运行时创建slate窗口
java·服务器·ue5
2401_8532757326 分钟前
ArrayList 源码分析
java·开发语言
爪哇学长30 分钟前
SQL 注入详解:原理、危害与防范措施
xml·java·数据库·sql·oracle
MoFe11 小时前
【.net core】【sqlsugar】字符串拼接+内容去重
java·开发语言·.netcore
笨小古1 小时前
路径规划——RRT-Connect算法
算法·路径规划·导航
_江南一点雨1 小时前
SpringBoot 3.3.5 试用CRaC,启动速度提升3到10倍
java·spring boot·后端
<但凡.1 小时前
编程之路,从0开始:知识补充篇
c语言·数据结构·算法
深情废杨杨1 小时前
后端-实现excel的导出功能(超详细讲解)
java·spring boot·excel
智汇探长1 小时前
EasyExcel自定义设置Excel表格宽高
java·excel·easyexcel