Java实现单链表反转的多种方法总结

 更新时间:2021年04月12日 10:33:35   作者:起个花名好难  
这篇文章主要给大家介绍了关于Java实现单链表反转的多种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

对于单链表不熟悉的可以看一下基于Java实现单链表的增删改查

一、原地反转

1、新建一个哨兵节点下一结点指向头结点

2、把待反转链表的下一节点插入到哨兵节点的下一节点

反转之前的链表:1–>2–>3–>4>–>5

加入哨兵节点:dummp–>1–>2–>3–>4>–>5

原地反转:

定义:prev=dummp.next; pcur=prev.next;

prev.next=pcur.next;

pcur.next=dummp.next;

dummp.next=pcur;

pcur=prev.next;

public Stu_node reverse_list(Stu_node head){
        if (head.next==null ||head.next.next==null)
            return null;
        Stu_node dump = new Stu_node(-1," ");
        dump.next=head;
        Stu_node prev = dump.next;
        Stu_node pcur = prev.next;
        while(pcur!=null){
            prev.next=pcur.next;
            pcur.next=dump.next;
            dump.next=pcur;
            pcur=prev.next;
        }
        return dump.next;
    }

二、新建链表头结点插法

二、新建链表头结点插法:

新建一个头结点,遍历原链表,把每个节点用头结点插入到新建链表中。最后,新建的链表就是反转后的链表。

public Stu_node reverse_list1 (Stu_node head){
        //新建一个新的链表的头结点
        Stu_node dump = new Stu_node(-1," ");
        Stu_node pcur = head;
        //遍历待反转链表,头结点插入到新的链表中
        while(pcur!=null){
            Stu_node pnext = pcur.next;
            pcur.next = dump.next;
            dump.next=pcur;
            pcur=pnext;
        }
        //新链表头结点不是需要返回的数据,因此返回头结点的下一节点
        return dump.next;
    }

三、利用栈结构实现链表的反转

由于栈结构存储数据是先进后出(后进先出)也可以通过栈达到反转链表的目的。

 public Stu_node reverse_stack(Stu_node head){
        Stack<Stu_node> stack = new Stack<>();
        Stu_node temp = head;
        //链表入栈
        while(temp!=null){
            stack.push(temp);
            temp=temp.next;
        }
        //取出栈中的一个节点当做新的链表的头结点
        Stu_node new_head = stack.pop();
        Stu_node cur = new_head;
        //出站
        while(!stack.isEmpty()){
            Stu_node node = stack.pop();
            //将出站的节点指向取消
            node.next=null;
            //将新的链表串起来
            cur.next = node;
            cur = node;
        }
        return new_head;
    }

四、完整代码奉上

import java.util.Stack;

public class revere_node {
    public static void main(String[] args) {
        LinkedNode list= new LinkedNode();
        Stu_node node1 = new Stu_node(1,"张三");
        Stu_node node2 = new Stu_node(2,"李四");
        Stu_node node3 = new Stu_node(3,"王二");
        Stu_node node4 = new Stu_node(4,"麻子");
        Stu_node node5 = new Stu_node(5,"赵六");
        //打印添加节点之前的链表
        list.print();
        //尾结点添加节点
        list.add(node1);
        list.add(node2);
        list.add(node3);
        list.add(node4);
        list.add(node5);
        //打印添加加点之后的链表
        list.print();
        System.out.println("-------------------");
        //定义一个头结点接收调用函数返回的头节点
        Stu_node head = list.reverse_stack(list.head);
        //遍历输出每个节点
        while (head.next!=null){
            System.out.println(head);
            head=head.next;
        }

    }
}
//定义一个链表的操作类
class LinkedNode{
    //定义一个头结点
    Stu_node head = new Stu_node(-1," ");
    //添加链表的方法
    public void add(Stu_node node){
        Stu_node temp = head;
        while(true){
            if (temp.next==null)
                break;
            temp=temp.next;
        }
        temp.next=node;
    }
    //打印链表
    public void print(){
        Stu_node temp = head.next;
        if (head.next==null){
            System.out.println("此链表为空");
        }
        while (temp!=null){
            System.out.println(temp);
            temp=temp.next;
        }
    }
    //原地反转
    public Stu_node reverse_list(Stu_node head){
        if (head.next==null ||head.next.next==null)
            return null;
        Stu_node dump = new Stu_node(-1," ");
        dump.next=head;
        Stu_node prev = dump.next;
        Stu_node pcur = prev.next;
        while(pcur!=null){
            prev.next=pcur.next;
            pcur.next=dump.next;
            dump.next=pcur;
            pcur=prev.next;
        }
        return dump.next;
    }
    //新建一个新的链表,头结点插入法实现链表的反转
    public Stu_node reverse_list1 (Stu_node head){
        Stu_node dump = new Stu_node(-1," ");
        Stu_node pcur = head;
        while(pcur!=null){
            Stu_node pnext = pcur.next;
            pcur.next = dump.next;
            dump.next=pcur;
            pcur=pnext;
        }
        return dump.next;
    }
    //利用栈实现反转链表
    public Stu_node reverse_stack(Stu_node head){
        Stack<Stu_node> stack = new Stack<>();
        Stu_node temp = head;
        //链表入栈
        while(temp!=null){
            stack.push(temp);
            temp=temp.next;
        }
        //取出一个节点当做新的链表的头结点
        Stu_node new_head = stack.pop();
        Stu_node cur = new_head;
        //出站
        while(!stack.isEmpty()){
            Stu_node node = stack.pop();
            //将出站的节点指向取消
            node.next=null;
            //将新的链表串起来
            cur.next = node;
            cur = node;
        }
        return new_head;
    }
}
//节点类
class Stu_node{
    int num;
    String name;
    Stu_node next;
    //重写toString方法,显示节点数据
    @Override
    public String toString() {
        return "Stu_node{" +
                "num=" + num +
                ", name='" + name + '\'' +
                '}';
    }

    public Stu_node(int num, String name) {
        this.num = num;
        this.name = name;
    }
}

总结

到此这篇关于Java实现单链表反转的多种方法的文章就介绍到这了,更多相关Java单链表反转方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于Java多线程notify与notifyall的区别分析

    基于Java多线程notify与notifyall的区别分析

    本篇文章对Java中多线程notify与notifyall的区别进行了详细的分析介绍。需要的朋友参考下
    2013-05-05
  • 将Springboot项目升级成Springcloud项目的图文教程

    将Springboot项目升级成Springcloud项目的图文教程

    本文主要介绍了将Springboot项目升级成Springcloud项目,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • IDEA 报Plugin'maven-resources-plugin:'not found 的解决方案

    IDEA 报Plugin'maven-resources-plugin:'not found 

    如果在使用 IDEA 时遇到 "Plugin 'maven-resources-plugin:' not found" 错误,可能是由于 Maven 仓库中未找到所需的 Maven 插件,近小编给大家分享几种解决方法,感兴趣的朋友跟随小编一起看看吧
    2023-07-07
  • Java中的@Builder注解问题详解

    Java中的@Builder注解问题详解

    这篇文章主要介绍了Java中的@Builder注解详解,@Builder 注解的其中一个大坑会导致默认值失效,这是使用此注解出现的一个问题,总的来说,不推荐再使用 @Builder 注解,接下来讲重点介绍其原因和替代方案,需要的朋友可以参考下
    2023-10-10
  • Java中四种9*9乘法表的实现方式(附代码)

    Java中四种9*9乘法表的实现方式(附代码)

    这篇文章主要介绍了Java中四种9*9乘法表的实现方式(附代码),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • SpringBoot使用自定义注解+AOP+Redis实现接口限流的实例代码

    SpringBoot使用自定义注解+AOP+Redis实现接口限流的实例代码

    这篇文章主要介绍了SpringBoot使用自定义注解+AOP+Redis实现接口限流,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • 如何解决springboot自动重启问题

    如何解决springboot自动重启问题

    这篇文章主要介绍了如何解决springboot自动重启问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • spring监视器actuator配置应用

    spring监视器actuator配置应用

    这篇文章主要介绍了spring监视器actuator配置应用,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • 自带IDEA插件的阿里开源诊断神器Arthas线上项目BUG调试

    自带IDEA插件的阿里开源诊断神器Arthas线上项目BUG调试

    这篇文章主要为大家介绍了自带IDEA插件阿里开源诊断神器Arthas线上项目BUG调试,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • SpringBoot使用log4j2将日志记录到文件及自定义数据库的配置方法

    SpringBoot使用log4j2将日志记录到文件及自定义数据库的配置方法

    这篇文章主要介绍了SpringBoot使用log4j2将日志记录到文件及自定义数据库的配置方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-03-03

最新评论