標籤:
//輸入一個單向鏈表,輸出該鏈表中倒數第k個結點。鏈表的倒數第0個結點為鏈表的尾指標。//我的思路是2個指標往後面找,你想啊,如果是一個指標,肯定需要遍曆2次,第一個遍曆總共節點數,第二次才遍曆最終結果//這樣的做法明顯是不夠好的,時間複雜度變成了2n,但是如果我們用2個指標,他們之間的距離差k個節點,有一個節點到達NULL//時(尾部),另一個節點就是我們要求的節點可以返回得到結果.#include <iostream>using namespace std;template<typename T>struct ListNode{ T m_nKey;//資料域 ListNode* m_pNext;//指標域ListNode():m_nKey(T()),m_pNext(NULL){}ListNode(T value):m_nKey(value),m_pNext(NULL){}};template<typename T>class List{public:List(){head = new ListNode<T>();}void Insert(T value){ListNode<T> *s = new ListNode<T>(value);s->m_pNext = head->m_pNext;//頭插節點.head->m_pNext = s;} ListNode<T>* Find(int k)//尋找目標節點.{ListNode<T> *p = head;ListNode<T> *q = head;for(int i=0;i<k;i++)//讓p指標先走一會兒(讓子彈先飛一會兒).{p=p->m_pNext;if(p==NULL)return NULL;}while(p!=NULL)//此刻q,p再同時走,知道p走到結尾,然後返回q就是結果.{q=q->m_pNext;p=p->m_pNext;}return q;}T Getvalue(ListNode<T> *t)//根據節點來擷取值,測試用.{return t->m_nKey;}private:ListNode<T> *head;};int main(){List<int> list;int Item;while(cin>>Item,Item!=-1){list.Insert(Item);}cout<<list.Getvalue(list.Find(4))<<endl;return 0;}
C++單鏈表找倒數第k個節點(時間複雜度為o(n)哦,用相距k節點的2個指標進行操作)