思想:通过双指针实现,设指针p、q初试都指向头结点。指针p后移k次,然后指针p、q一起后移直到p指向空指针。写代码过程中要考虑一些异常情况,如K大于链表长度等。
实现代码如下:
#include<iostream> using std::cin; using std::cout; using std::endl; using std::runtime_error; struct ListNode { int num; ListNode *next; }; int getLastKNum(ListNode *head,int k) { if(head==NULL) { throw runtime_error("头指针为空"); } if(k<=0) throw runtime_error("k必须为正数"); ListNode *p=head,*q=head; while(k>0&&p)//p右移k次 { p=p->next; --k; } if(k>0) throw runtime_error("K大于链表长度!"); while(p) { p=p->next; q=q->next; } if(q==head)//当k等于链表长度+1. throw runtime_error("K大于链表长度!"); else return q->num; } void deleteList(ListNode *head)//释放空间 { ListNode *p=head; ListNode *q=head; while(p) { q=p; p=p->next; delete q; } } int main() { ListNode *head=new ListNode(); head->next=NULL; for(int i=1;i<10;i++) { ListNode *tmp=new ListNode(); tmp->num=i; tmp->next=head->next; head->next=tmp; } try { for(int i=1;i<=9;i++) cout<<getLastKNum(head,i)<<endl; }catch(runtime_error err) { cout<<err.what()<<endl; } deleteList(head); }
思想来自于July博客http://blog.csdn.net/v_july_v/article/details/6441279。
2.1、什么是亲和数?
以下是摘自维基百科的解释:
相亲数(Amicable Pair),又称亲和数、友爱数,指两个正整数中,彼此的全部约数之和(本身除外)与另一方相等。
例如220与284:
换句话说,亲和数又可以说成是两个正整数中,一方的全部约数之和与另一方的全部约数之和相等。
int SumOfDivisor(int n) { int sum=1; for(int i=2;i<=n/2;i++) { if(n%i==0) sum+=i; } }而July采用了另一个种办法.
#include<iostream> using std::cin; using std::cout; using std::endl; void Amicable_Pair(int n); int main() { int n; cin>>n; Amicable_Pair(n); return 0; } /* *求n内的亲和数 */ void Amicable_Pair(int n) { int *num=new int[n]; for(int i=0;i<n;i++) num[i]=1; for(int i=2;i<=n/2;i++) { int j=i+i; while(j<n) { num[j]+=i; j+=i; } }//求出1-n的所有约数(除去本身) for(int i=220;i<n;i++) { if(i<num[i]&&num[i]<n&&i==num[num[i]]) cout<<i<<" "<<num[i]<<endl; } delete[] num; }