题目描述
找出单向链表中的一个节点,该节点到尾指针的距离为K。链表的倒数第0个结点为链表的尾指针。要求时间复杂度为O(n)。
链表结点定义如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
}
链表节点的值初始化为1,2,3,4,5,6,7。
输入描述:
该节点到尾指针的距离K
输出描述:
返回该单向链表的倒数第K个节点,输出节点的值
示例1
输入
2
输出
6
备注:
请自觉实现一个链表,将1到7依次加入链表,然后再寻找倒数第K个节点。要求加节点与找节点的操作复杂度均为O(n)。
解题思路:
从0开始计数,
倒数第k个节点,是正数第n-k个节点,
两个指针pre和back,pre先走k,然后两个指针一起走,他们之间间隔是k。当pre到达尾节点时,第一个指针正好到达第n-k个节点,即倒数第k个节点。
但这题感觉题怪怪的,倒数第0个接点是尾指针,那距离尾指针为2的应该是5才对啊,而样例是6。这样的话,这题跟剑指offer上的那题就一样了。
#include<cstdio>
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
ListNode* find(ListNode* ListHead,int k)
{
if(ListHead==nullptr||k<=0) return nullptr;
ListNode* pre=ListHead;
ListNode* back=ListHead;
for(int i=0;i<k-1;i++)
{
if(pre->m_pNext!=nullptr) pre=pre->m_pNext;
else return nullptr;
}
while(pre->m_pNext!=nullptr)
{
pre=pre->m_pNext;
back=back->m_pNext;
}
return back;
}
int main()
{
ListNode* ListHead=new ListNode;
ListHead->m_nKey=1;
ListHead->m_pNext=nullptr;
ListNode* tail=ListHead;
for(int i=2;i<8;i++)
{
ListNode *node=new ListNode;
node->m_nKey=i;
node->m_pNext=nullptr;
tail->m_pNext=node;
tail=tail->m_pNext;
}
int n;
scanf("%d",&n);
ListNode* res=find(ListHead,n);
if(res) printf("%d",res->m_nKey);
}