面试题10 找到链表中倒数第 K 个元素
2016-01-02 07:47
246 查看
题目: 写一个方法返回一个单向链表中倒数第 k 个元素. 比如, 3->1->4->1->5->9->2->6 那么倒数第三个元素是 9 所以该方法应该返回 9
思路: 这道题挺好想的 就是算出来倒数第 k 个元素是正数第几个 然后找到这个元素 当然这是我们知道链表 size 的情况 代码如下
此方法的时间复杂度是 O(k) 空间复杂度是 O(1)
让然 如果不知道链表的 size, 就稍微难想一点了
思路是这样的 我们使用两个指针同时指向 head 然后我们将其中一个指针 移动到正数第 k 个元素上 让另一个指针保持不动, 然后我们让两个指针同时向前移动 当前面的指针指向链表末端的时候 后面的指针应该刚好达到链表的倒数第 k 个元素 代码如下
此方法的时间复杂度和空间复杂度 和第一个方法一样 只不过此方法可以再不知道链表 size 的情况下完成任务
思路: 这道题挺好想的 就是算出来倒数第 k 个元素是正数第几个 然后找到这个元素 当然这是我们知道链表 size 的情况 代码如下
class MyLinkedList2<E> extends SinglyLinkedList<E>{ public MyLinkedList2(){ super(); } public E mySolution(int k){ if(super.size()<k) return null; int position = super.size()-k; Node<E> target = super.findFirst(); for(int i=0; i<position; i++) target = target.next(); return target.data(); } }
此方法的时间复杂度是 O(k) 空间复杂度是 O(1)
让然 如果不知道链表的 size, 就稍微难想一点了
思路是这样的 我们使用两个指针同时指向 head 然后我们将其中一个指针 移动到正数第 k 个元素上 让另一个指针保持不动, 然后我们让两个指针同时向前移动 当前面的指针指向链表末端的时候 后面的指针应该刚好达到链表的倒数第 k 个元素 代码如下
class MyLinkedList2<E> extends SinglyLinkedList<E>{ public MyLinkedList2(){ super(); public E anotherSolution(int k){ if(k<=0) return null; Node<E> p1 = super.findFirst(); Node<E> p2 = super.findFirst(); for(int i=0; i<k-1; i++){ if(p2==null) return null; p2 = p2.next(); } if(p2==null) return null; while(p2.next()!=null){ p1 = p1.next(); p2 = p2.next(); } return p1.data(); } }
此方法的时间复杂度和空间复杂度 和第一个方法一样 只不过此方法可以再不知道链表 size 的情况下完成任务
相关文章推荐
- 指针和数组的面试题
- 黑马程序员——折纸问题、九九乘法表和菱形图案的打印
- 程序员新年愿景
- 黑马程序员——Java---&&和||逻辑表达式
- 黑马程序员——阶乘的两种实现方法及水仙花数的打印
- 程序员精选图书
- 往者可谏,来者可追
- 程序员练级之路
- 实习一个月,记录下对学习能力这个词的感觉。
- 程序员应该如何安排好自己的时间
- Hadoop 经典面试问题.
- 31个Hadoop面试经典问题
- 2016重新启航,纪念我那逝去的程序员生涯
- 面试中遇到的随机题目
- 程序员面试技巧总结
- 28岁程序员的2016规划
- (转)应届生经典面试题:说说进程与线程的区别与联系
- 如何成为一个好的程序员(2)
- 如何成为一个好的程序员
- 如何成为一个好的程序员...java应用架构师之后