fightFor复试-day0308-单链表查找倒数第k个节点-快慢指针
原题链接http://www.acmerblog.com/interview-10-2438.html
题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。链表结点定义如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
和这道题相似的有:输入一个单向链表。如果该链表的结点数为奇数,输出中间的结点;如果链表结点数为偶数,输出中间两个结点前面的一个。
思路:也是用快慢指针,一个每次移动一个,而另一个每次移动两个。快指针到头,那么慢指针所指就是所求。
另外:使用指针之前判断是不是空指针-编程细节-好的习惯
#include<cstdio>
#include<cstdlib>
#include<fstream>
#include<iostream>
using namespace std;
#define SIZE 400
struct ListNode
{
int val;
ListNode* next;
};
int KfromLast(ListNode* head,int k){
if(head==NULL)
return -1;
ListNode* slow = head;
ListNode* fast = head;
int t=k;
while(t--){
fast=fast->next;
}
while(fast->next!=NULL){
fast = fast->next;
slow = slow->next;
}
return slow->val;
}
int main()
{
ifstream cin("cin.txt");
int n,t;
while(cin>>n){
ListNode* tail=NULL;
ListNode* head=NULL;
for(int i=0; i<n; i++){
//ListNode* tmp = (ListNode*)malloc(sizeof(ListNode));
ListNode* tmp = new ListNode;
cin>>t;
tmp->val = t;
tmp->next = NULL;
if(head==NULL){
head=tmp;
tail=head;
//cout<<"now the head == NULL"<<endl;
}
else{
//cout<<"now the head is not NULL"<<endl;
tail->next=tmp;
tail=tail->next;
}
}
tail = head;
while(tail!=NULL){
cout<<tail->val<<" ";
tail=tail->next;
}
cout<<endl;
cout<<KfromLast(head,n-1)<<endl;
}
return 0;
}

浙公网安备 33010602011771号