面试题15:链表中倒数第k个结点
2015-06-30 22:02
513 查看
<span style="font-size:18px;">/*面试题15 题目:输入一个链表,输出该链表中的倒数第k个结点。本题从1开始计数,即链表的尾点是倒数第1个结点。 常规思路:遍历一次链表得到结点数n,再从头开始的第n-k+1个结点就是倒数第k个结点。也就是遍历两次链表。 一次遍历的方法:设置两个指针。第一个指针从头开始向前走k-1步,从第k步开始第二个指针也从头开始遍历。当第一个指针 到达尾结点时,第二个指针正好是倒数第k个结点。 */ ListNode* FindKthToTail(ListNode* pListHead,unsigned int k) { if(pListHead==NULL||k==0) //处理头结点为NULL,k为0时的异常 return NULL; ListNode* pAhead=pListHead; ListNode* pBehind=NULL; for(int i=0;i!=k-1;++i) { if(pAhead->m_pNext!=NULL) //处理结点总数小于k的异常 pAhead=pAhead->m_pNext; else return NULL; } pBehind=pListHead; while(pAhead->m_pNext!=NULL) { pAhead=pAhead->m_pNext; pBehind=pBehind->m_pNext; } return pBehind; } //测试用例包含:功能测试(k在中间,头结点,尾结点),特殊输入测试(头结点为NULL,结点数小于k,k等于0) //相关题目:求链表的中间结点(一个指针一次一步,一个一次两步,快的到达尾结点时,慢的是中间结点),判断 //一个链表是否形成了环形结构(一个一次一步,有一个一//次两步,快的追上慢的,形成了环形链表)。</span>
java代码实现,需要的node类在http://blog.csdn.net/cfcf0517/article/details/46674929
public Node findLastKthElement(Node head,int k){ if(k<1||k>this.length()) return null; Node p1=head; Node p2=head; for(int i=0;i<k-1;i++) p1=p1.next; while(p1!=null){ p1=p1.next; p2=p2.next; } return p2; }
相关文章推荐
- 2015面试记三
- 黑马程序员——Java基础--常见对象总结(二)
- 黑马程序员——单例设计模式
- 菜鸟好文推荐(八)——为什么我不想成为Web前端程序员
- 黑马程序员——equals和==的区别
- 剑指offer面试题8——旋转数组的最小数字
- 黑马程序员——java的IO之流操作的基本规律,Properties类,打印流,序列流
- 黑马程序员——java的IO之字符流,字节流,转换流
- 面试题3---二维数组中查找
- 面试题8:旋转数组的最小数字
- 面试题7:用两个栈实现队列
- 程序员必须要会算法吗? 获奖名单公布
- 诸葛分享:怎么面试架构师
- java 面试
- 黑马程序员---异常总结
- 编程范式,程序员的编程世界观
- 阿里巴巴离职DBA 35岁总结的职业生涯
- 面试题6:重建二叉树
- sql的简单的面试题
- 面试题5:从尾到头打印链表