摘要: 这个也是面试中经常遇到的问题了。反转单链表有两种方法可以解决,递归形式和非递归形式(非递归形式意思就是用循环哦)。在我看来,循环形式比起递归形式来,更有效率并且需要更少的内存。(比如反转一个有一百万结点的链表,递归形式肯定没戏,至少栈溢出。。。)。递归形式的唯一有点嘛,就是代码行数少点而已,并且别看行数少,写对写好确很难!换句话说,循环形式需要些更多的代码,但是也很好实现和验证。先来看循环形式:void reverse(Node*& head) {if (!head) return;Node* prev = NULL;Node* curr = head;while (curr) {No 阅读全文
posted @ 2013-06-26 17:29 老刘++ 阅读(915) 评论(1) 推荐(0) 编辑
摘要: 这是一道非常常见的面试题,嗯,经典的链表问题。最简单直观的办法需要O(N^2)的时间和O(N)的空间,即储存所有访问过的结点,每当访问到一个新的结点时,与所有储存的结点依次比较即可。这个方法看上去不那么高明,提示一下,最优解法只需要O(N)的时间和O(1)的空间。再提示一下,对于链表问题,很有用的一种方法就是用两个指针(快慢指针)来遍历链表!现在让我们来看看这个最优解法吧!之前已经提到了,最优解法只需要O(N)的时间和O(1)的空间。它使用两个指针,快慢指针。慢指针每次向前走一步,而快指针走两步。如果单链表存在环,那么最终,快结点和慢结点会相遇。换句话说,如果单链表没环,那么快结点会在慢结点之 阅读全文
posted @ 2013-06-25 16:53 老刘++ 阅读(236) 评论(0) 推荐(0) 编辑