链表中的倒数第k个节点
2015-11-01 14:26
381 查看
题目:输入一个链表,输出该链表的倒数第k个节点。从1开始计数,即链表的尾节点为倒数第1个节点。
解答:首先自然想到的是寻找倒数第k个节点,那么就是从前往后数第n-k+1个节点,则先对链表遍历一遍得到链表的长度,然后第二次遍历时走n-k+1步就可以了。但是该方法需要对链表遍历两次,有没有只需要遍历依次的方法?自然是有的,可以想到用两个指针的方法,先让第一个指针先走k-1步,然后第二个指针指向链表的第1个节点,然后两个指针同时往后走,当第二个指针达到尾节点时,第一个指针指向的正是倒数第k个节点。struct Node{
int m_data;
Node* m_pNext;
Node(const int data = 0,Node* next = NULL):m_data(data),m_pNext(next){}
};
Node* FindKthNodeToTail(Node* pHead,const int k)
{
if(!pHead || k <= 0)
return NULL;
Node* pFirstNode = pHead;
Node* pSecondNode = pHead;
for(int index = 0; index < k-1; ++index)
{
if(NULL == pFirstNode->m_pNext)//防止k大于链表长度
return NULL;
pFirstNode = pFirstNode->m_pNext;
}
while(pFirstNode->m_pNext)
{
pFirstNode = pFirstNode->m_pNext;
pSecondNode = pSecondNode->m_pNext;
}
return pSecondNode;
}
解答:首先自然想到的是寻找倒数第k个节点,那么就是从前往后数第n-k+1个节点,则先对链表遍历一遍得到链表的长度,然后第二次遍历时走n-k+1步就可以了。但是该方法需要对链表遍历两次,有没有只需要遍历依次的方法?自然是有的,可以想到用两个指针的方法,先让第一个指针先走k-1步,然后第二个指针指向链表的第1个节点,然后两个指针同时往后走,当第二个指针达到尾节点时,第一个指针指向的正是倒数第k个节点。struct Node{
int m_data;
Node* m_pNext;
Node(const int data = 0,Node* next = NULL):m_data(data),m_pNext(next){}
};
Node* FindKthNodeToTail(Node* pHead,const int k)
{
if(!pHead || k <= 0)
return NULL;
Node* pFirstNode = pHead;
Node* pSecondNode = pHead;
for(int index = 0; index < k-1; ++index)
{
if(NULL == pFirstNode->m_pNext)//防止k大于链表长度
return NULL;
pFirstNode = pFirstNode->m_pNext;
}
while(pFirstNode->m_pNext)
{
pFirstNode = pFirstNode->m_pNext;
pSecondNode = pSecondNode->m_pNext;
}
return pSecondNode;
}
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- [C/C++]反转链表
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- C#实现基于链表的内存记事本实例
- C#中struct和class的区别详解
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例