链表的反转的三种方法
链表反转的三种方法
- 普通链表反转法
- 思想:借助三个Node变量进行节点的移动,促成next指向变化,从而使链表反转
- 递归链表反转法
- 思想:想像一个反转成功的链表与剩下的头节点的反转,思考如何进行,只要拆分出来的相似问题解决好了,就直接可用调用自己的方法进行解决
- 头节点链表反转法
- 借助头节点以及新节点(newNode=null),这里是一个循环,条件为头不为空,第一步保存头节点为temp,第二步头节点指向它的下一个节点,保存好的头节点的下一个节点指向新节点(此时反转成功,再把newNode后移就行)
package com.javase.reverselink;public class ReverseLink {public static void main(String[] args) {Node<Integer> head =buildLink();Node<Integer> newNode =recursiveReverseLink(head);print(newNode);}public static Node<Integer> reverseLink(Node<Integer> head){//提前判断,如果链表的长度为0或1,则不需要反转if(head==null||head.next==null){return head;}//需要三个变量进行控制Node<Integer> preNode =null;Node<Integer> currentNode =head;Node<Integer> nextNode = head.next;//执行反转currentNode.next = preNode;//循环反转while (nextNode!=null){//整体移动preNode =currentNode;currentNode=nextNode;nextNode=currentNode.next;//执行反转currentNode.next = preNode;if(nextNode==null){head=currentNode;}}return head;}/*** 使用递归的方式进行链表反转* @param head 旧的链表的头结点* @return 反转后的链表的头结点*/public static Node<Integer> recursiveReverseLink(Node<Integer> head){//退出机制if(head == null || head.next ==null){return head;}//分成两个部分 1.一个结点 2、后边已经反转成功的链表Node<Integer> newHead = recursiveReverseLink(head.next);//核心的反转逻辑head.next.next=head;head.next=null;return newHead;}public static Node<Integer> headInsertReserveLink(Node<Integer> head){if(head==null||head.next==null){return head;}Node<Integer> temp = null,newHead=null;while(head!=null){temp=head;head=head.next;temp.next=newHead;newHead =temp;}return newHead;}/*** 用来遍历打印链表的数据* @param head*/public static void print(Node<Integer> head){Node<Integer> current = head;while(current!=null){System.out.println(current.t);current=current.next;}}public static Node<Integer> buildLink(){Node<Integer> head = new Node<>(1);Node<Integer> node2 = new Node<>(2);Node<Integer> node3 = new Node<>(3);Node<Integer> node4= new Node<>(4);Node<Integer> node5 = new Node<>(5);head.next=node2;node2.next=node3;node3.next=node4;node4.next=node5;return head;}private static class Node<T>{private T t;private Node<T> next;public Node(T t){this.t=t;}}
}
链表的反转的三种方法相关推荐
- 单链表实现反转的三种方法
单链表的操作是面试中经常会遇到的问题,今天总结一下反转的几种方案: 1 ,两两对换 2, 放入数组,倒置数组 3, 递归实现 代码如下: #include<stdio.h> #includ ...
- C语言实现不带头结点的单链表逆置的三种方法
C语言实现不带头结点的单链表逆置的三种方法 直接循环 头插法 递归法 END! 直接循环 图片解释 ListNode* ReverseList1(ListNode *head) {if(head == ...
- java字符串abc反转_JAVA字符串反转的三种方法
方法一:使用StringBuilder import java.util.Scanner; public class StrReversal { public static void main(Str ...
- 实现java字符串反转的三种方法
实现java字符串反转的三种方法 1.问题描述:将字符串String="abcdefg"实现反转变成 "gfedcba":用java语言实现. 2.解决方法: ...
- JAVA字符串反转的三种方法
在键盘中输入asd,反转后得到的是:dsa,这就是字符串的反转:这其中的思路就是运用到逆向遍历的想法.先从键盘中录入字符串,然后获取字符串中的每个字符,再进行逆向的遍历,将遍历的字符放在一个新建的空字 ...
- python list是数组还是链表实现的_python 数据结构 list和链表实现栈的三种方法
MAX_SIZE = 100 classMyStack1(object):"""模拟栈""" def __init__(self): sel ...
- 链表反转的四种方法(栈、头插法、三指针法、递归法)
单链表反转或转置的四种方法 链表的反转实质上是反转链表上的内容: 若链表存储的数据是:1->2->3->4->5; 那么反转后则是:5->4->3->2-&g ...
- 在JavaScript中反转字符串的三种方法
This article is based on Free Code Camp Basic Algorithm Scripting "Reverse a String" 本文基于F ...
- 链表逆置(三种方法详解)
@Achievek 6-1 单链表逆转 (20 point(s)) 本题要求实现一个函数,将给定的单链表逆转. ##函数接口定义: List Reverse( List L ); 其中List结构定义 ...
最新文章
- TCP/IP 笔记 1.3 IP:网际协议
- 【Android】Source Insight 基本用法 ( 导入 Android 源码 | 设置字体 | 显示行号 | 搜索功能 | 快捷键设置 )
- c语言编程平均分,用C语言编程平均分数
- python3中map函数_python3中map()和reduce()函数
- 热成像成像不清楚是什么时候_「从零搞机」热成像仪查看 分形工艺Node 202 机箱 风道散热情况...
- elasticsearch in查询_Python Elasticsearch DSL 查询、过滤、聚合操作实例
- Elasticsearch实现原理分析
- 论文浅尝 | 面向开放域的无监督实体对齐
- thymeleaf模板引擎基础使用(转)
- Java生产环境下性能监控与调优详解 第5章 Tomcat性能监控与调优
- oracle保持会话连接,oracle中连接与会话
- 图像处理之调整亮度与饱和度
- LINUX SHELL中大小写转换及注意事项
- 打造风格独特的心仪简历——Word 简历整活心得
- 软件测试狂斩五家大厂的简历长什么样?
- qq远程听到计算机声音,QQ2017远程播放视频没有声音_软件应用_电脑知识学习_培训之家...
- [NOI2008]糖果雨
- Selenium自动化测试:如何使用cookie跳过验证码登录
- cesium 模型实体平移
- 机票售票系统/飞机票购票系统的设计与实现