题解 | #输出单向链表中倒数第k个结点#
输出单向链表中倒数第k个结点
http://www.nowcoder.com/practice/54404a78aec1435a81150f15f899417d
两个指针一个先走k步,一个后走,先走的到终点时后走的刚好到倒数第k个
/*输入一个单向链表,输出该链表中倒数第k个结点, 链表的倒数第1个结点为链表的尾指针。*/ #include<iostream> using namespace std; struct ListNode { int m_nKey; ListNode* m_pNext; }; void createlist_R(ListNode* &L,int n)//尾插法 { L= new ListNode; L->m_pNext=NULL; ListNode *r=L; for(int i=0;i<n;i++) { ListNode *p; p=new ListNode; cin>>p->m_nKey; p->m_pNext=NULL; r->m_pNext=p; r=p; } } void print(ListNode* L) { ListNode* p; p=L->m_pNext; while(p) { cout<<p->m_nKey<<" "; p=p->m_pNext; } cout<<endl; } void kk(ListNode* &L,int k) { ListNode* a; ListNode* b; a=L->m_pNext; b=L->m_pNext; int i=0; while((i<k)&&a)//a先向前走k步 { a=a->m_pNext; i++; } while(a&&b)//a到达终点时b到达倒数第k个顶点 { a=a->m_pNext; b=b->m_pNext; } cout<<b->m_nKey<<endl; } int main() { ListNode* L; int n; int k; while(cin>>n) { createlist_R(L,n); cin>>k; // print(L); if(k!=0) kk(L,k); else cout<<0<<endl; } }