206. 反转链表

179 篇文章 0 订阅
178 篇文章 5 订阅

反转单链表原地法与头插法

单链表遍历打印

我们先复习一下单链表遍历打印

    public void printLink(){
        Node curNode = head;
        while(curNode !=null){
            System.out.print(curNode.data+" ");
            curNode = curNode.next;
        }
        System.out.println();
    }

单链表打印是用一个curNode单指针来判断单链表是不是空,不是空,直接打印,后移,再判断是不是空。
直到是空为止,结束打印。

双指针反转单链表

这里的"双指针反转单链表"是两个指针prev和curr。prev指向前一个结点curr指向当前节点
微信截图_20200302113740.jpg

微信截图_20200302122253.jpg

    public ListNode reverseList(ListNode head) {
        //当前节点的前一个节点
        ListNode prev = null;
        //定义一个辅助指针帮我们遍历原来的链表
        ListNode curr = head;
         while(curr!=null){
             //备份原来的节点
             ListNode nextTemp = curr.next;
             curr.next = prev;//指针反转
             prev = curr;//前结点后移
             curr = nextTemp;//当前结点后移
         }
         return prev;
    }

关键是理解这两步

curr.next = prev;
prev = curr;

这两步,curr.next=prev其实可以对照实例想一下,2指向3的指针,指向了1。
就是说,指针原来从左右,就变为了右左。
指针反转就完了?不是的,我们只是把当前链表的指针向反转了,新的链表的指针还没有移动。
微信截图_20200302124447.jpg
所以,我们要prev = curr,让prev移动。
其实,这里的prev是反转后的链表的头节点。注意了,这里的头结节可不是什么辅助节点,是真真实实有数据的头节点。
一定要根那种辅助头区分开来。
理解了这两步,我们就不断的判断curr指针是不是空,不断的反转就可以了。最后curr==null时,
我们就返回prev指针。
微信截图_20200302125500.jpg

参考资料

反转链表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值