操作方法和步骤:
(1)定义2个指针p1,p2。
(2)使用循环让p2指向顺数第n个节点,同时p1指向第头结点;
(3)然后,p1和p2同时移动,直到p2指向NULL,此时p1应该指向倒数第n个节点。
iNode * GetLastNnode(iNode * head, int n) { iNode * pfirst=head; // p2 iNode *psecond=head; // p1 int counter; //第1步:建立标尺,移动pfirst N步 for(counter=0; counter<n; counter++) { pfirst = pfirst->next; if(NULL == pfirst) break; // 此时pfirst->next无意义 } if(n != counter) //长度不够n,未找到倒数第n个节点 return NULL; //第2步:保持距离让标尺向右移动,直到右端指向末尾,左端即结果 while(pfirst!=NULL) { pfirst=pfirst->next; psecond=psecond->next; } return psecond; }
// 精简程序,只有一个出口,就一个return iNode * GetLastNnode ( iNode *head, int n) { iNode * pfirst = head; iNode * psecond = NULL;//可能没有n个 while( n-- > 0 && (pfirst!= NULL) { pfirst = pfirst ->next; } if(pfirst!= NULL)// 有n个节点 psecond = head; while(pfirst!=NULL) { pfirst = pfirst ->next; psecond = psecond ->next; } return psecond; //只有一个出口,无论是否有n个节点,都能返回正确值 }