第七篇:链表常见面试题--单链表的反转问题

1、单链表的反转

public class LinkedListReverseTest {

    public static void main(String[] args) {
        Node a = new Node("A");
        Node b = new Node("B");
        Node c = new Node("C");
        Node d = new Node("D");
        Node e = new Node("E");
        Node f = new Node("F");
        a.next = b;
        b.next = c;
        c.next = d;
        d.next = e;
        e.next = f;
        print(a);
//        print(reverse(a));
//        print(reverseByRecursion(a));
    }

    /**
     * 打印链表中的内容
     */
    public static void print(Node node) {
        StringBuilder str = new StringBuilder();
        while (node.next != null) {
            str.append(node.value).append("->");
            node = node.next;
            if (node.next == null) {
                str.append(node.value);
            }
        }
        System.out.println(str);
    }
}

/**
 * 定义一个单链表
 */
class Node {
    public String value;
    public Node next;

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

1.1、非递归写法

在这里插入图片描述

/**
     * 链表反转(正向遍历)
     * 第一步:先将第一个节点拿出给一个临时新建的链表
     * 第二步:将当前第一个节点的引用指向他的下一个节点,从而使下次遍历时又从第一个开始
     * 第三步:临时节点的next指向新建的链表节点
     * 第四步:将临时节点的引用给新建的链表节点
     * */
    public static Node reverse(Node node){
        Node newNode = null;
        while(node != null){
            Node tmp = node;
            node = node.next;
            tmp.next = newNode;
            newNode = tmp;
        }
        return newNode;
    }

1.2、递归写法

在这里插入图片描述

/**
     * 链表反转(递归)
     * */
    public static Node reverseByRecursion(Node node){
        Node newNode = null;
        if(node == null || node.next == null){
            newNode = node;
        }else{
            Node temp = reverseByRecursion(node.next);
            node.next.next = node;
            node.next = null;
            newNode = temp;
        }
        return newNode;
    }
发布了47 篇原创文章 · 获赞 0 · 访问量 1187

猜你喜欢

转载自blog.csdn.net/weixin_43103748/article/details/103507317