理论基础 —— 线性表 —— 循环链表
生活随笔
收集整理的這篇文章主要介紹了
理论基础 —— 线性表 —— 循环链表
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【概述】
循環鏈表的構建與單鏈表十分相似,唯一不同的是,對于鏈表的表尾,需要將原來的 NULL 改為 first
以下僅給出構造函數的實現
【構造函數】
1.無參構造函數
生成一個頭結點,讓頭指針指向頭結點,并將頭結點的指針域指向頭指針。
template <class T> linkList<T>::circleList(){//無參構造函數first=new Node<T>;//頭指針指向頭結點first->next=first;//頭結點的指針域指向頭指針 }2.有參構造函數
1)頭插法
使用頭插法的有參構造函數,構造循環鏈表的主體部分與單鏈表一致,區別在于要在一開始令頭結點指向頭指針,即?first->next=first
template <class T> linkList<T>::circleList(T a[],int n){//頭插法的有參構造函數first=new Node<T>;first->next=first;//頭結點指向頭指針//與單鏈表一致for(int i=0;i<n;i++){Node<T> *s=new Node<T>;s->data=a[i];s->next=first->next;first->next=s;} }2)尾插法
使用尾插法的有參構造函數,構造循環鏈表的主體部分與單鏈表一致,區別在于建表完畢后要將尾指針指回頭結點,即?r->next=first
template <class T> linkList<T>::circleList(T a[],int n){//尾插法的有參構造函數first=new Node<T>;Node<T> *r=first;for(int i=0;i<n;i++){Node<T> *s=new Node<T>;s->data=a[i];r->next=s;r=s;}r->next=first;//將尾指針指回頭結點 }【經典應用】
循環鏈表能解決許多問題,其中,最經典的,就是對于約瑟夫環問題的解決
約瑟夫環是一個數學的應用問題:已知 n 個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍,從編號為 k 的人開始報數,數到 m 的那個人出列,他的下一個人又從 1 開始報數,數到 m 的那個人又出列,依此規律重復下去,直到圓桌周圍的人全部出列,問最后剩下的那個人的編號
解決:使用不帶頭指針的循環鏈表即可解決,將初始編號加入循環鏈表后,開始尋找報數起點,然后從報數起點開始,報數循環到第 m-1 個點,最后將 m-1 號點之后的 m 號點從循環鏈表中刪除即可,重復尋找 m-1 號點刪除 m 號點,直到剩下一個結點。
struct Node{int data;Node *next; }; int main(){int n,m,k;cin>>n>>m>>k;Node *first=new Node;//頭指針first->data=1;Node *p=first;//工作指針for(int i=2;i<=n;i++){Node *s=new Node;//新建節點s->data=i;p->next=s;p=p->next;}p->next=first;//鏈表尾端指向鏈表頭,構成循環鏈表p=first;for(int i=1;i<=k-1;i++)//尋找報數起點p=p->next;while(p!=p->next){//只剩下一個結點時for(int i=1;i<m-1;i++)//循環報數到m之前的一個結點p=p->next;Node *q=p->next;//第m個元素即要出環的元素p->next=q->next;//摘鏈delete q;//刪除出換元素p=p->next;//繼續指向下一元素}cout<<(p->data)<<endl;return 0; }?
總結
以上是生活随笔為你收集整理的理论基础 —— 线性表 —— 循环链表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2019 年“浪潮杯”第十届山东省 AC
- 下一篇: 搜索 —— 启发式搜索 —— 爬山法