Java简单实现单链表反转

单链表反转问题

1.问题描述

对一个单向链表进行反转操作,如1-->2-->3-->4-->5-->null

翻转后的结果为5-->4-->3-->2-->1-->null

2.解决方案

A 遍历链表 

把链表拆分成数组 然后把数组逆序组装成链表

该方法实现简单,不需要太多指针,缺点是需要n个单位的空间

B 指针逆序

三个指针,分别指向 当前节点(p),当前节点的下一个节点(q),q的下一个节点(r)。r的存在是为了修改q的next指针指向p时,原本q的next值不会丢失。源码如下。

public class Node {

    public int value;
    public Node next;

    public Node(int value) {
        this.value = value;
    }

    public boolean hasNext() {
        return next != null;
    }
}
private static Node reverse(Node node) {
        Node p = node;
        Node q = p.next;
        Node r;

        p.next = null;
        while (q != null) {
            r = q.next;
            q.next = p;
            p = q;
            q = r;
        }
        return p;
    }

C 递归法

首先,把第一个节点之后的部分D视为一个整体,认为D已经是逆序的,现在要做的是把第一个节点和D节点组成的链表进行逆序;

其次,要对D节点内部进行逆序,用同样的思维进行处理;

再次,递归出口,当D节点的next为空时,说明D节点是最后一个节点,直接返回即可。

实现源码如下。

/**
     *
     * @param node 链表头结点
     * @param pre 头结点逆序指向的节点
     * @return
     */
    private static Node reverseRecursion(Node node, Node pre) {
        Node head = node;
        Node pnext = head.next;
        head.next = pre;
        if (pnext == null) {
            return head;
        }
        return reverseRecursion(pnext, head);
    }


以上

猜你喜欢

转载自blog.csdn.net/zibaihe007/article/details/78683480