您的位置:首页 > 职场人生

面试题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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: