单链表之单链表逆置
2015-10-19 12:50
260 查看
首先是使用三指针方法实现。
三指针就是使用三个指针分别记录操作每个结点的<<前驱结点>>,<<本身结点>>,<<后驱结点>>。
通过while循环不断的调整顺序,然后逐点后移进行操作。
使用头插法实现翻转
翻转链表(遍历)
从头到尾遍历原链表,每遍历一个结点,
将其摘下放在新链表的最前端。
注意链表为空和只有一个结点的情况。时间复杂度为O(n)
单链表逆置的递归实现:
三指针就是使用三个指针分别记录操作每个结点的<<前驱结点>>,<<本身结点>>,<<后驱结点>>。
通过while循环不断的调整顺序,然后逐点后移进行操作。
使用头插法实现翻转
翻转链表(遍历)
从头到尾遍历原链表,每遍历一个结点,
将其摘下放在新链表的最前端。
注意链表为空和只有一个结点的情况。时间复杂度为O(n)
public static Node reverseList(Node head) { // 如果链表为空或只有一个节点,无需反转,直接返回原链表表头 if (null == head || head.next == null) return head; // 反转后新链表头指针 // 初始为null Node reHead = null; // 当前处理节点 Node cur = head; // 当前节点后移之前保存当前节点以防止丢失 Node pre = null; while (cur != null) { // 用pre保存对要处理节点的引用 pre = cur; // cur更新到下一个节点 cur = cur.next; // 更新要处理节点的next引用 pre.next = reHead; // reHead指向要处理节点的前一个节点 reHead = pre; } return reHead; }
单链表逆置的递归实现:
/** * 翻转递归(递归) 递归的<<精髓>>在于你就默认reverseListRec已经<<成功帮你解决>>了子问题了!但别去想如何解决的 * 现在只要处理<<当前node>>和<<子问题>>之间的关系。最后就能圆满解决整个问题. */ public static Node reverseListRec(Node head) { // 如果链表为空或只有一个节点,无需反转,直接返回原链表表头 // 第一个条件是判断异常,第二个条件是结束判断 if (null == head || null == head.next) { return head; } Node reHead = reverseListRec(head.next);// 记录子序列的新的头结点 // 当前结点与已经逆置的子序列看成是前后的两个结点p,q,作相应的逆置操作 head.next.next = head; // 把head接在reHead串的最后一个后面 head.next = null; // 防止循环链表 return reHead;// 返回新的子序列的头结点 }
相关文章推荐
- Linux下一个Redis启动/关闭/重新启动服务脚本
- JDBC编程实现文件、图片的存储方法
- JAVA调用易信接口向指定好友推送消息(二)POST测试
- C语言值传递,C语言地址传递
- JavaSE知识点个人总结
- delphi 获取可执行文件的当前路径
- yuv422/yuv420格式
- HDU 5501——The Highest Mark——————【贪心+dp】
- Oracle 常用的查询语句
- Spark修炼之道(高级篇)——Spark源码阅读:第一节 Spark应用程序提交流程
- 仿美团下拉刷新动画
- 模拟器和真机运行都是屏幕上下有黑色的条
- 仿美团下拉刷新动画
- 使用 Android NDK 的交叉编译工具链移植 C/C++ 项目到安卓平台
- 数据结构(一)STL二分法查找实现及上下界
- 单链表之合并单链表:
- Xamarin改写安卓Residemenu控件
- C++STL之list双向链表容器
- Linux程序移植到Android上
- Find the Duplicate Number