面试题15:链表中倒数第k个结点

来源:互联网 发布:ssh 命令行带端口号 编辑:程序博客网 时间:2024/06/04 17:45
<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;elsereturn 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;}


0 0