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; }