C++單鏈表找倒數第k個節點(時間複雜度為o(n)哦,用相距k節點的2個指標進行操作)

來源:互聯網
上載者:User

標籤:

//輸入一個單向鏈表,輸出該鏈表中倒數第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個指標進行操作)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.