思路还是挺简单的,就是要注意细节。
该题目考察的你思考问题的缜密性
要注意的地方在程序标注啦。
有问题欢迎指正
1.给定链表为空,或者k等于负数,或者0的时候,默认返回NULL
2.k值存在大于链表长度的可能,k大于链表长度,返回NULL
#include<iostream>
using namespace std;
//结构。
struct ListNode
{
int val;
ListNode* next;
ListNode(int x) :val(x), next(NULL) {}
};
class solution {
public:
ListNode* findKthnode(ListNode* head, int k)
{
if (!head || k <= 0) return NULL;//注意特殊情况。
ListNode* tempNode = head;
ListNode* slowNode = head;
for (int i = 0;i < k-1;i++)
{
if (tempNode->next)//k是有可能超过链表长度的,注意。
{
tempNode = tempNode->next;
}
else return NULL;
}
while (tempNode->next)
{
tempNode = tempNode->next;
slowNode = slowNode->next;
}
return slowNode;
}
};
ListNode* creatList()
{
ListNode* prehead = new ListNode(-1);
ListNode* dummy = prehead;
cout << "输入链表,(通过“-1”终止输入):" << endl;
while (true)
{
int value;
cin >> value;
cout << " -> ";
if (value == -1)
break;
ListNode* donecreatList = new ListNode(value);
dummy->next = donecreatList;
dummy = dummy->next;
}
cout << endl;
return prehead->next;
}
void printList(ListNode* head)
{
ListNode* forprintList;
forprintList = head;
while (forprintList)
{
cout << " " << forprintList->val;
forprintList = forprintList->next;
}
cout << endl;
}
int main()
{
solution solute;
ListNode* head = creatList();
cout << "给定链表:" << endl;
printList(head);
head = solute.findKthnode(head, -1);
cout << "返回:" << endl;
if(head)//如果返回值为空,下一句就会触发异常,故要注意该if句不可省。
cout << head->val;
return 0;
}
相关题目拓展:
1.打印链表的中间结点:快慢指针,一个走一步,另一个走两步,快的走完,慢的就会走到中点。
2.判断是否为环形链表:快慢指针,同上,快的追上慢的就是环形,快的指向了NULL,则非环形。