leetcode刷题-206反转链表

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

leetcode206-反转链表

前文

本文为菜鸟的刷题记录,仅用作笔记使用,并非最佳解决方案。

题目信息

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例 1:

输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1] 示例 2:

输入:head = [1,2] 输出:[2,1] 示例 3:

输入:head = [] 输出:[]

解题思路分析

解法1

本方案主要是采用前后节点置换的思路。在递归操作中末尾节点,从末尾节点向前进行递归操作。按照递归的思路进行处理。每次都需要找到下一节点。将下一节点的下一节点设置为当前节点,同时将下一节点的当前下一节点作为上一节点替换。以此思路进行操作,直至最后一个节点返回,作为头节点即可。 代码如下:

    public ListNode reverseList(ListNode head) {
            if(head == null){
                return null;
            }
    //        结束节点
            if(head.next == null){
                return head;
            }else{
                ListNode node = reverseList(head.next);
                ListNode last = getNextNode(head);
                head.next = null;
                last.next = head;
                return node;
            }
        }

        public ListNode getNextNode(ListNode node){
            if(node.next != null){
                return getNextNode(node.next);
            }else{
                return node;
            }
        }
复制代码

解法2

本方法属于对递归方法的一种优化,简化递归过程中的处理步骤,降低代码量。思路同样是两个节点之间的关联替换处理。 代码如下:

public ListNode reverseList(ListNode head) {
        if(head == null){
            return null;
        }
//        结束节点
        if(head.next == null){
            return head;
        }else{
            ListNode node = reverseList(head.next);
            head.next.next = head;
            head.next = null;
            return node;
        }
    }
复制代码

复杂度分析

  • 时间复杂度 o(n)
  • 空间复杂度 o(1)

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。

猜你喜欢

转载自juejin.im/post/7016893336766119967
今日推荐