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数据结构与算法之反转单链表的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法学习——单链表相关算法

算法练习2之单链表求和

#yyds干货盘点# 数据结构与算法之单链表

JAVA常考点之数据结构与算法JAVA面试

数据结构与算法 - 单链表逆转

高效代码之反转单链表