链表逆序

简述

前段时间一个哥们说他面试的时候,面试官问了他一个链表逆序的问题。走在路上突然想起这个问题来,发现这个问题对于单链表来说确实是个不小的问题。

思维过程:

  • 首先,单链表是有方向的顺序存储,我们一般只记录起始位置和结束位置,所以对链表的大部分操作都是O(n)的效率。但是相对于连续存储的数组,链表具有插入、删除元素,不需要额外的数据移动操作;
  • 其次,链表的数据是不连续的,有效的利用零散的内存空间,利于数据的扩展;
  • 最后,链表基于元素可订制,非常适用于复杂数据结构存储类型。

思考过程:

第一次思考的时候,我把这个逆序问题缩小为3个节点的问题。即第二个节点的next指针改成指向其前面元素的地址,第三个节点的next指针改成指向第二个元素的地址。但是这个是一个思维误区,习惯了把大问题变成小问题的思想,什么问题都往上面套是不对的。虽然小问题的思考过程是没错的,但是不利于扩展。

最后老实的按照一步步的拆链表,验证了自己的想法。
链表逆序

然后根据上图的拆分链表过程,理清了自己的思维过程。
从图中可以看出需要一个保存当前处理节点位置的指针,同时还需要一个保存新链表的头指针。
代码就这样呼之欲出了
    public Node ReverseList(Node root) {

        Node current = root;
        Node prev = null;   ///> 记录新的逆序列表
        Node next = null;   ///> 作为辅助记录
        while (current != null) {
            prev = current;
            current = current.next;
            prev.next = next;
            next = prev;
        }
        return prev;
    }

结语

最近看了一本书,说是不光是记录结果,如果说逆序,只给出代码,并没有意义。最终要的是要记录下自己的思维过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值