链表逆序

简述

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

思维过程:

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

思考过程:

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

最后老实的按照一步步的拆链表,验证了自己的想法。
链表逆序_第1张图片

然后根据上图的拆分链表过程,理清了自己的思维过程。
从图中可以看出需要一个保存当前处理节点位置的指针,同时还需要一个保存新链表的头指针。
代码就这样呼之欲出了
    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;
    }

结语

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

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