反转链表

链表反转:

 

 

 

(图1)

把问题规模减小,并且减小的量为1

 

 

 

(图2)

假设我们的程序能够正常的反转:则反转后为

 

 

 

(图3)

反转后,1元素并没有任何操作,所以反转1的next仍然指向2,

 

 

 

(图4)

假设2开头的链表已经反转成功,接下来只要将2的next指向1,

 

 

 

(图5)

而1的next指向null即可。

 

 

 

(图6)

看似复杂的问题,把如此多的指针反过来指,其实只要将两个节点反过来即可。

public static ListNode ReverseListDigui(ListNode head) {
    
        //链表为空或者只有一个节点的时候
        
        if(head==null || head.next==null){
            return head;
        }
        
        ListNode newhead=ReverseListDigui(head.next);
        head.next.next=head;
        head.next=null;
        
        bianLi(newhead);
        
        return newhead;
        
        
    }

 

 非递归实现

public static ListNode ReverseList(ListNode head) {
        
        ListNode pre=null,cur=head,next=null;
        
        while(cur!=null) {
            
            next=cur.next;
            cur.next=pre;
            pre=cur;
            cur=next;
            
        }
        
        return pre;
    }

 

 


————————————————
版权声明:本文为CSDN博主「华天下之大软」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37117521/article/details/80808631

posted @ 2019-10-29 14:14  落地成霜  阅读(138)  评论(0编辑  收藏  举报