struct ListNode
{
};
这里,我们有两种思路,一种是遍历所有的单向链表,得到链表的长度n,然后第二次遍历该链表,找到正数第n-k+1个节点即可,这种思路的缺点是要两次遍历所有的节点,效率较低,对应的c++代码如下
ListNode* FindKthToTail_Solution1(ListNode* pListHead, unsigned int k)
{
}
第一种思路需要两次的时间将链表中的节点读入物理内存,如果链表很长的话,显然很费时间
第二种思路是维持两个指针,他们之间的间隔为k-1,一个指针在前,一个指针在后,这样当前一个指针遍历到结尾的时候,后面的指针指向的便使第k个节点,首先,我们可以先让前面的指针走到第K个节点(从1开始),然后同时移动两个指针,直到前面的指针指向尾节点
ListNode* FindKthToTail_Solution1(ListNode* pListHead, unsigned int k){
}
//运行到这里,两个指针的位置已经是相差k-1个了
while(first->m_pnext!=null){//同时移动两个指针
first = first->m_pNext;
last = last->m_pNext;
}
return last;
}
第二种算法的优越之处在于只需要将链表读入一次内存即可,巧妙地通过一些简单的数学计算和算法技巧来达到解决问题的目的。
本篇文档对应何海涛博客
http://zhedahht.blog.163.com/blog/static/2541117420072114478828/