java数据结构与算法之反转单链表
Posted wen-pan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java数据结构与算法之反转单链表相关的知识,希望对你有一定的参考价值。
java数据结构与算法之反转单链表
方式一、通过指针方式实现单链表反转
具体步骤:
需要用到三个指针(pre,current,next)分别指向当前节点的前一个节点,当前节点,当前节点的下一个节点
- 首先current指针指向链表头节点
- pre指针指向null
- next指针指向null
- 进入while循环
- 然后将next指针指向current的下一个节点(临时保存下一个节点,以防止丢失下个节点)
- 然后将pre指针指向current
- 然后将next赋值给current
- 重复上面从while循环开始步骤,直到current指针为空,则退出循环
- 返回pre节点,该节点就是反转后的链表的新的头节点
代码示例:
/**
* 通过指针的方式反转单链表
*/
public static SingleNode flipSingleListByPointer(final SingleNode head) {
if (head == null || head.next == null) {
return head;
}
SingleNode current = head;
// pre和next分别指向当前处理节点的前一个和后一个
SingleNode pre = null;
SingleNode next = null;
while (current != null) {
// 暂存当前节点的下一个节点
next = current.next;
current.next = pre;
pre = current;
current = next;
}
// 返回新的头节点,这里一定要返回pre不能返回current,上面current已经为空了
return pre;
}
方式二、通过递归方式实现单链表反转
主要是利用了递归能暂存节点数据的特性!!!
/**
* 通过递归方式反转一个单链表
*/
public static SingleNode flipSingleListByProcess(final SingleNode head) {
// basecase
if (head == null || head.next == null) {
return head;
}
// 利用递归能保存head的引用,这里递归主要是找到链表的最后一个元素(即反转后的链表头)
final SingleNode newHead = flipSingleListByProcess(head.next);
// 将head.next的next指针指向head(即:反转head.next指针的指向)
head.getNext().setNext(head);
// 将head的next指针指向null
head.next = null;
// 返回反转后的新头
return newHead;
}
当遍历完单链表从basecase返回时链表结构如下图所示:
以上是关于java数据结构与算法之反转单链表的主要内容,如果未能解决你的问题,请参考以下文章