带环相交链表问题
帶環相交鏈表問題
- 設計目的:
- 總覽效果效果:
- 需求分析
- 概要設計
- 詳細設計
設計目的:
掌握鏈表的基本操作。
掌握帶環鏈表的相關操作算法。
總覽效果效果:
需求分析
1需要帶頭結點的單鏈表,根據元素值輸入對比,修改鏈域,形成新鏈表。
2快慢指針法或者標記數組兩種方法。
3修改鏈域,恢復單鏈表,根據鏈表長度,遍歷鏈表得到鏈表中間節點。
4分四種情況討論鏈表相交情況。
概要設計
1struct node{數據域;鏈域;標記位;}
2void makecircle(double x,double y)//輸入元素值成環
{ 1,找到值為x,y的指針;
2y的鏈域指向x,x鏈域指向空;
}
3void iscircle()//標記數組法
{1,將節點標記位置為1;
2,遍歷鏈表,并修改節點標志位為0;
3,判斷節點的下一節點的標記位若為0,則有環,否則無環。
}
Void Iscircle()//快慢指針法
{ 1,快指針每次前進2,慢指針每次前進1;
2,快慢指針若相等,則有環,否則無環。
}
4 void notcircle()
{1,修改鏈域,恢復成單鏈表;
2,第一遍遍歷鏈表,求出鏈表節點個數;
3,第二遍遍歷鏈表,求出中間節點位置指針;
}
5
Nodeischarge()
{( 1)一個鏈表有環,一個鏈表無環,則兩鏈表不相交。
(2)兩個鏈表均有環,用一個鏈表快慢指針的相遇點去遍歷,若遇到另一個鏈表的相遇點則相交,共用一個環,否則不相交。
(3)兩個鏈表相交,交點在環外,修改鏈域轉化為不帶環的兩個單鏈表求交點。
(4)兩個鏈表相交,交點在環上。
}
Node entrynode()//得到環路入口位置
{根據追及相遇問題模型,頭指針和快慢指針相遇點每次進一,最后相等的位置即為環路入口位置。}
詳細設計
1,if (temp1 > temp2){node* p;p = p2;p2 = p1;p1 = p;}//始終令p1指向先出現得節點 newfirst = new node;newfirst->link = p2->link;//新頭節點指向p2得后續節點p2->link = p1;//成環 2,while (current != NULL){ if (current->link->flag == 0){current->flag = 1;current = current->link;// 遍歷過程中修改標志位}else if (current->link->flag == 1){n = current;m = current->link;// 返回環路起點 終點return true;} while (fast != NULL && fast->link != NULL)//快指針先為空,則為單鏈表無環{ slow = slow->link; //慢指針每次前進一步fast = fast->link->link;//快指針每次前進兩步if (slow == fast) //相遇,存在環break;}if (fast && fast->link) return fast; 3, int cnt = 0;//計數器while (current != NULL){cnt++;current = current->link;}//若有偶數個節點 輸出中間兩個 若有奇數個節點 輸出正中間得current = first->link; int i = 0;while (current != NULL){i++;if (i == (cnt / 2)) break;else current = current->link;} 4,node* circlenode1 = Iscircle(p);node* circlenode2 = Iscircle(q);if (circlenode1 == NULL || circlenode1 == NULL) return NULL;//第一種情況,如果其中任意一條鏈不帶環 則不相交 while (current != circlenode1 && current != circlenode2) current = current->link;if (current != circlenode2) return NULL;//第二種情況,都有環,用一個相遇點去遍歷,未遇到另一個相遇點,則不相交。node* entry1 = entrynode(p, circlenode1);node* entry2 = entrynode(q, circlenode2); if (entry1 == entry2)//情況3,將環去掉,轉化為兩個單鏈表相交,求交點{while (current1 != NULL){while (current2 != NULL){if (current1 == current2)return current1;else current2 = current2->link;}current2 = q;current1 = current->link;}} //第四種情況,兩個入口點,任意返回return entry1;總結
- 上一篇: 《中国人史纲》读书笔记:第八章、第九章
- 下一篇: 路由配置与管理——ISIS路由配置与管理