简述
前段时间一个哥们说他面试的时候,面试官问了他一个链表逆序的问题。走在路上突然想起这个问题来,发现这个问题对于单链表来说确实是个不小的问题。
思维过程:
- 首先,单链表是有方向的顺序存储,我们一般只记录起始位置和结束位置,所以对链表的大部分操作都是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;
}
结语
最近看了一本书,说是不光是记录结果,如果说逆序,只给出代码,并没有意义。最终要的是要记录下自己的思维过程。