题目:输入一个链表,查找该链表中的倒数第k个结点
比如链表为{1,2,3,4},则倒数第2个节点为3。
思路:
使用两个指针,第1个指针先走k-1步,然后,两个指针同时前进,知道第一个指针走到链表末尾。
注意:该题应当注意如果k超过链表长度的情况,增加代码鲁棒性。
#include <iostream>
using namespace std;
struct ListNode {
int value;
ListNode *pNext;
};
/**
*用于查询倒数第K个结点
*/
ListNode* findLastKNode(ListNode *pHead,int k) {
if(pHead==NULL || k <= 0) {
return NULL;
}
ListNode *pBehind = pHead;
ListNode *pForwardK = pHead;
int pos = 0;
//提前指针先走k-1步
while(pos<k-1 && pForwardK != NULL) {
pos++;
pForwardK = pForwardK->pNext;
}
//如果提前指针为空,即代表查询范围超出链表长度
if(pForwardK == NULL)
return NULL;
//提前K步指针与随后指针共同前进
while(pForwardK->pNext != NULL) {
pForwardK = pForwardK->pNext;
pBehind = pBehind->pNext;
}
return pBehind;
}
/**
* 向链表中插入结点
*/
void insertList(ListNode **pHead,ListNode *value) {
ListNode *head = *pHead;
if(head == NULL) {
*pHead = value;
}
else {
while(head->pNext != NULL) {
head = head->pNext;
}
head->pNext = value;
}
}
/**
* 向链表中插入结点
*/
void insertList(ListNode **pHead,int value) {
ListNode *p = new ListNode();
p->value = value;
p->pNext = NULL;
insertList(pHead,p);
}
int main() {
//构造链表
ListNode *head = NULL;
insertList(&head,1);
insertList(&head,2);
insertList(&head,3);
//测试实例
//1.链表的最后一个结点
//2.链表的中间结点
//3.链表的第一个结点
//4.越界步长
ListNode *lastK = NULL;
lastK = findLastKNode(head,1);
cout<<lastK->value<<endl;
lastK = findLastKNode(head,2);
cout<<lastK->value<<endl;
lastK = findLastKNode(head,3);
cout<<lastK->value<<endl;
lastK = findLastKNode(head,4);
if(lastK == NULL)
cout<<"NULL"<<endl;
return 0;
}