LeetCode-206. 反转链表-Java实现

实现效果

非递归实现

在这里插入图片描述

public ListNode reverseList(ListNode head) {
        if(head==null){
            return null;
        }else if(head.next==null){
            return head;
        }
        
        ListNode now = head;
        ListNode nextNextTemp = null;
        ListNode next = null;
        ListNode pre = null;
        do{
           next = now.next;
            if(next==null){
                now.next = pre;
                pre = now;
                break;
            }
           nextNextTemp = next.next;
           next.next = now;
           now.next = pre;
           pre = next;
            now = nextNextTemp;
        }while(now!=null);
        return pre;
    }

递归实现

在这里插入图片描述

public ListNode reverseList(ListNode head) {
        if(head==null){
            return null;
        }else if(head.next==null){
            return head;
        }else{
            ListNode next = head.next;
            ListNode result = null;
            if(next.next==null){
                next.next = head;
                head.next = null;
                result = next;
            }else{
                result = reverseList(next);
                next.next = head;
                head.next = null;
            }
            return result;
        }
    }

过程

递归实现

实现起来先实现的是递归方法,其实就是把任务分解成一个循环重复的步骤,我习惯是从出口考虑的,也就是最后一层的递归,也就是将最后一个节点的next指针指向前一个(也就是这一层递归的head),然后返回最后一个节点的引用(指针),然后前面的迭代就是把之前引用的本层的next节点的next(也就是next.next)指向本层的head,因为next节点是下一轮返回来的ListNode的最后一个节点,所以应该指向head,倒回去后,在第一层返回这个节点就可以了,记得要把head.next设为空,要不然就死循环了。

非递归实现

非递归实现在时间上更快,因为其少了方法的嵌套(也就是少了方法的出栈入栈操作),具体而言就是一个循环,每一次的循环就是把链表截断成两部分,一部分是反向后的,一部分是未反向,每一次循环就是从未反向的链表中拿出一个来放到反向后的末尾,知道最后发现节点为NULL时就结束了。

猜你喜欢

转载自blog.csdn.net/ws948342046/article/details/87098586