首页 > 编程语言 > 详细

《剑指offer》面试题16 反转链表 Java版

时间:2019-09-30 11:42:08      阅读:64      评论:0      收藏:0      [点我收藏+]

(输入链表的头节点,反转链表)

书中方法:对于一个链表,我们只能从头往后遍历,如果要反转,我们需要更改当前节点的next域指向前一个节点,此时链表断开,为了能继续修改下一个节点的next域,我们还要维护下一个节点。

    public ListNode reverse(ListNode first){
        if(first == null)return first;
        ListNode last = null;
        ListNode now = first;
        ListNode next = first.next;
        while(now != null){
            now.next = last;
            
            last = now; 
            now = next;
            if(now != null){
                next = now.next;
            }
        }
        return last;
    }

方法二:书后面还提到了递归的方法。自己写的逻辑比较不清楚,在网上找了一个版本。这个方法的思路是:递归返回的是当前节点右侧已经反转好的链表的头节点,对于当前的节点,将它连接到已经reverse好的链表的末尾,返回值是添加了该节点的新链表头。先递归后处理,最后的返回值是反转后的节点,每次递归返回的是添加了当前节点的反转后的链表。注意递归出口的处理。

    public ListNode reverse2(ListNode first){
        if(first == null || first.next == null)return first;
        
        ListNode newHead = reverse2(first.next);
        first.next.next = first;
        first.next = null;
        
        return newHead;
        
    }

《剑指offer》面试题16 反转链表 Java版

原文:https://www.cnblogs.com/czjk/p/11611783.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!