算法面试题 1 链表反转

69 阅读2分钟

看下下面这道题

image.png

将这个链表反转过来,这种题一般有两种方法来解决

一.迭代:重复某一过程,每一次处理的结果作为下一次处理的初始值,直至达到最终状态 二.递归:将一个大问题拆分为小问题,在运行过程中调用自身

逻辑比较绕,先看下下面这两张图,1为迭代,2为递归;

image.png

image.png

按照图示开始编码,如下,代码有注释,需要仔细看啊 , 这块确实有点绕的

/**
 *
 * @author : Mr.Leslie
 * @version 1.0
 * @description: TODO
 * @date 2022/7/16 16:21
 */
public class LinkedListReverse {
    //内部类-节点对象
    static class Node{
        //值
        int value;
        //下一节点
        Node next;

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

        @Override
        public String toString() {
            return "Node{" +
                    "value=" + value +
                    ", next=" + next +
                    '}';
        }
    }

    //迭代方法-从第一个元素开始遍历
    public static Node iterate(Node head){
        //第一个元素的前置节点为null
        Node prev=null;
        //下一节点
        Node next;
        //当前遍历位置curr 初始值就是head
        Node curr=head;
        //为什么用while?因为不知道链表的长度,什么时候跳出循环?看上图 无论反转前后,当遍历到最后一个元素时,next已经是 null的时候就可以结束循环
        while (curr!=null){
            //首先保存当前节点的next指针
            next=curr.next;
            //将prev赋值给next
            curr.next=prev;
            //将curr赋值给指针指向的下一对象的prev
            prev=curr;
            //将指向下一节点的next赋值给curr
            curr=next;
        }
        //返回prev就是反转后的链表
        return prev;
    }

    //递归
    public static Node recursion(Node head){
        //当节点本身为null 或者指针指向的结果为null时,代表最后一个节点
        if(head==null||head.next==null){
            return head;
        }
        //递归找到最后一个节点
        Node newHead = recursion(head.next);
        //第一次5的next指向 4,第二次 4 next指向 3 
        head.next.next=head;
        //4的next 为null,3的next置为null
        head.next=null;
        //将值返回到63行
        return newHead;
    }

    public static void main(String[] args) {
        Node node5=new Node(5,null);
        Node node4=new Node(4,node5);
        Node node3=new Node(3,node4);
        Node node2=new Node(2,node3);
        Node node1=new Node(1,node2);
        System.out.println("反转前:"+node1);
        Node prev = recursion(node1);
        System.out.println("反转后:"+prev);
    }
}

迭代打印结果

image.png

递归打印结果

image.png

可以拷贝代码自己跑一下,感谢收看