[算法]实现单链表的反转
2016-05-06 18:32
309 查看
实现链表的反转
解题思路:为了正确反转一个链表,需要调整指针的指向。举例说明,例如i,m,n是三个相邻的结点,假设经过若干步操作,已经把结点i之前的指针调整完毕,这些结点的next指针都指向前面一个结点。现在遍历到结点m,当然需要调整结点的next指针,让它指向结点i,但需要注意的是,一旦调整了指针的指向,链表就断开了,因为已经没有指针指向结点n,没有办法再遍历到结点n了,所以为了避免指针断开,需要在调整m的next之前要把n保存下来。接下来试着找到反转后链表的头结点。不难分析出翻转后链表的头结点是原始链表的尾结点,即next为空指针的结点。
实现代码如下:
/** * 两种方式实现单链表的反转 * @author dream * */ public class ReverseSingleList { /** * 递归,在反转当前结点之前先反转后续结点 * @param node * @return */ public static Node reverse(Node head){ if(head == null || head.getNextNode() == null){ return head; } Node reversedHead = reverse(head.getNextNode()); head.getNextNode().setNextNode(head); head.setNextNode(null); return reversedHead; } /** * 遍历,将当前结点的下一个结点缓存后更改当前结点 */ public static Node reverse2(Node head){ if(head == null){ return head; } Node pre = head; Node cur = head.getNextNode(); Node next; while (cur != null) { next = cur.getNextNode(); cur.setNextNode(pre); pre = cur; cur = next; } //将原链表的头结点的下一个结点置为null,再将反转后的头结点赋给head head.setNextNode(null); head = pre; return head; } }
Github源码地址
https://github.com/GeniusVJR/Algorithm-and-Data-Structure/tree/master/实现链表的反转
相关文章推荐
- Sequence【SDUT2169】——区间划分
- apache启动失败查看错误信息
- c++开源爬虫-Larbin简介
- 如何获取apk的签名信息?
- C#学习笔记20160506
- css实现3D动画效果
- android悬浮窗口的实现
- hdoj2046
- JDBC之PreparedStatement的用法
- 【DirectX11】第二篇 DirectX11渲染管线(2016.05.09更新)
- Object-c------Foundation中的结构体和字符串
- Linux安装Node.js
- 网游中的网络编程2:发送和接收数据包
- Android studio无法关联源码
- Eclipse使用Maven构建项目运行main方法报ClassNotFoundException
- Java集合-HashMap数据结构详解
- storm安装配置
- Qt QThread 这是我 见过解析最全面的一片文章
- 编译报错 does not contain bit code
- 基于bf算法统计文本中某个单词出现的频率