美文网首页
单链表反转-Java实现

单链表反转-Java实现

作者: 编程回忆录 | 来源:发表于2019-10-09 21:54 被阅读0次

算法1(非递归实现):使用3个指针,分别指向前序结点、当前结点和后序结点,遍历链表,逐个逆转,时间复杂度O(n):

/**
     * 非递归实现
     *
     * @param head
     * @return
     */
    static Node reverse1(Node head) {
        if (head == null || head.next == null) {
            return head;
        }
        Node current = head;
        Node pre = null;
        Node pnext = null;
        while (current != null) {
            pnext = current.next;
            current.next = pre;
            pre = current;
            current = pnext;
        }

        return pre;
    }

算法2(递归实现): 不断逆转当前结点,直到链表尾端,时间复杂度O(n):

   /**
     * 递归实现
     *
     * @param current
     */
    static Node reverse2(Node current) {
        if (current.next == null) {
            return current;
        }
        Node pnext = current.next;
        current.next = null;
        Node reversed = reverse2(pnext);
        pnext.next = current;

        return reversed;
    }

算法3(递归实现):和算法2类似,不过递归传入当前结点和前序结点,代码可读性要好点,时间复杂度O(n):

/**
     * @param current
     * @param pre
     * @return
     */
    static Node reverse3(Node current, Node pre) {
        if (current.next == null) {
            current.next = pre;
            return current;
        } else {
            Node next = current.next;
            current.next = pre;
            return reverse3(next, current);
        }
    }

所有完整代码如下:

package link.impl;

public class ReverseSingleLinkImpl {
    static class Node {
        int data;
        Node next;
    }

    public static void main(String[] args) {
        //reverse1
        System.out.println("impl1:");
        Node head = reverse1(buildSingleLinkList(new int[]{1, 2, 3, 4, 5}));
        while (head != null) {
            System.out.println(head.data);
            head = head.next;
        }
        //reverse2
        System.out.println("impl2:");
        head = reverse2(buildSingleLinkList(new int[]{1, 2, 3, 4, 5}));
        while (head != null) {
            System.out.println(head.data);
            head = head.next;
        }
        //reverse3
        System.out.println("impl3:");
        Node headNode = buildSingleLinkList(new int[]{1, 2, 3, 4, 5});
        head = reverse3(headNode, null);
        while (head != null) {
            System.out.println(head.data);
            head = head.next;
        }
    }

    /**
     * 非递归实现
     *
     * @param head
     * @return
     */
    static Node reverse1(Node head) {
        if (head == null || head.next == null) {
            return head;
        }
        Node current = head;
        Node pre = null;
        Node pnext = null;
        while (current != null) {
            pnext = current.next;
            current.next = pre;
            pre = current;
            current = pnext;
        }

        return pre;
    }

    /**
     * 递归实现
     *
     * @param current
     */
    static Node reverse2(Node current) {
        if (current.next == null) {
            return current;
        }
        Node pnext = current.next;
        current.next = null;
        Node reversed = reverse2(pnext);
        pnext.next = current;

        return reversed;
    }

    /**
     * @param current
     * @param pre
     * @return
     */
    static Node reverse3(Node current, Node pre) {
        if (current.next == null) {
            current.next = pre;
            return current;
        } else {
            Node next = current.next;
            current.next = pre;
            return reverse3(next, current);
        }
    }

    static Node buildSingleLinkList(int[] nodeArr) {
        Node head = null;
        Node next = null;
        for (int i : nodeArr) {
            Node node = new Node();
            node.data = i;
            node.next = null;
            if (head == null) {
                head = node;
                next = head;
            } else {
                next.next = node;
                next = node;
            }
        }
        return head;
    }
}

相关文章

  • 单链表反转

    单链表反转 单链表初始化 输出 反转 释放 实现代码 尚未实现 元素插入 元素删除

  • 链表简单算法相关练习

    单链表反转: 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 迭代方式实现: 复杂度分析: 时...

  • 链表

    单链表 C实现 Java实现 双链表 C实现 Java实现

  • 反转单链表(Java实现)

    如题: 定义一个方法(函数),实现输入一个链表的头结点,然后可以反转这个链表的方向,并输出反转之后的链表的头结点。...

  • 单链表反转-Java实现

    算法1(非递归实现):使用3个指针,分别指向前序结点、当前结点和后序结点,遍历链表,逐个逆转,时间复杂度O(n):...

  • 反转单链表Java实现

    问题描述 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 解题思路 为了实现反转单链表,...

  • 单链表反转问题

    基本问题 如何将单链表反转? 单链表结构定义 算法实现 进阶问题 如何将单链表在指定区间内进行反转? 问题分析 这...

  • Algorithm小白入门 -- 单链表

    单链表递归反转链表k个一组反转链表回文链表 1. 递归反转链表 单链表节点的结构如下: 1.1 递归反转整个单链表...

  • LeetCode链表专题

    (一)LeetCode206.反转链表 题目描述: 反转一个单链表。 代码实现 (二)LeetCode160. 相...

  • 15反转链表

    题目描述 输入一个链表,反转链表后,输出新链表的表头。 Java实现

网友评论

      本文标题:单链表反转-Java实现

      本文链接:https://www.haomeiwen.com/subject/kibipctx.html