剑指offer面试题24. 反转链表

题目

https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof/submissions/

思路

方法1、开辟一个o(n)数组,把链表的节点都放进去,然后逆序输出新的链表
方法2、使用中间变量 就像交换俩个数一样
方法3、使用递归实现。(难懂哦)


    /*
    方法一  使用中间变量 类似交换俩个变量的值一样
     时间复杂度是o(n)
     空间复杂度是o(1)
     */
    public ListNode reverseList(ListNode head) {
        if(head==null){
            return head;
        }
        ListNode pre =null;
        ListNode cur = head;
        while (cur!=null){
            ListNode temp = cur.next;
            cur.next = pre;
            pre = cur;
            cur = temp;

        }
        return pre;
    }

    /**
     *
     * @param head
     * @return  递归
     */
    public ListNode reverseListByRec(ListNode head) {
        //递归终止条件是当前为空,或者下一个节点为空
        if(head==null || head.next==null) {
            return head;
        }
        //这里的cur就是最后一个节点
        ListNode cur = reverseListByRec(head.next);
        //如果链表是 1->2->3->4->5,那么此时的cur就是5
        //而head是4,head的下一个是5,下下一个是空
        //所以head.next.next 就是5->4
        head.next.next = head;
        //防止链表循环,需要将head.next设置为空
        head.next = null;
        //每层递归函数都返回cur,也就是最后一个节点    cur表示翻转后的第一个节点。
        return cur;
    }


    public static void main(String[] args) {
        ListNode listNode = new ListNode(1);
        ListNode listNode1 = new ListNode(2);
        ListNode listNode2 = new ListNode(3);
        ListNode listNode3 = new ListNode(4);
        listNode.next = listNode1;
        listNode1.next =listNode2;
        listNode2.next =listNode3;
        ReverseListNode t = new ReverseListNode();
        ListNode sd = t.reverseListByRec(listNode);
        System.out.println(1);

    }

参考

慕课网波波的数据结构和算法

你可能感兴趣的:(数据结构和算法)