《劍指offer》:[37]如何得到連結串列環的入口地址
題目:如何得到連結串列環的入口結點
方案:分兩步走:
方案:分兩步走:
第一步:先要找到連結串列中的環,得到環的結點的個數。可以設定兩個指標一個走的比較快,一個比較慢,那麼如果連結串列中存在一個環,那麼這兩個指標一定會陷入這個環中,快的指標一定會遇到慢的指標,所以很快就能遇到。因為前面有詳細講過,這裡不再多介紹,給一張圖吧。
第二步:得到環的個數以後,我們照樣可以設定兩個指標。第一個指標先前進N(N為環中結點的個數)步,然後和第二個指標以相同的速度前進,當它們相遇時的結點就是連結串列中環的入口。具體過程如下圖所示:
#include <iostream>
using namespace std;
struct List
{
int data;
List *next;
};
int arr[7]={1,2,3,4,5,6,7};
List *pHead=NULL;
List *pNext=NULL;
List *pEnd=NULL;
bool InputInvalid=false;
void Listhelp(List **head,int data)
{
List *temp=new List ;
temp->data=data;
temp->next=NULL;
if(NULL==*head)
{
*head=temp;
pEnd=temp;
}
else
{
pEnd->next=temp;
pEnd=temp;
}
}
void CreateList(List **head,int *array,int length)
{
for(int i=0;i<length;i++)
Listhelp(head,array[i]);
//製造一個環;7->4
List *temp=*head;
while(temp->data!=4)
temp=temp->next;
pEnd->next=temp;
}
void show(List *head)
{
int count=0;
while(head)
{
cout<<head->data<<" ";
head=head->next;
count++;
if(count==15)
break;//有環所以用break退出;
}
}
int GetNumOfCircle(List *head)
{
int NodeCount=1;
if(NULL==head)
{
InputInvalid=true;
return 0;
}
List *pSlow=head->next;
if(pSlow==NULL)
{
InputInvalid=true;
return 0;
}
List *pFast=pSlow->next;// two steps;
while(pSlow!=NULL && pFast!=NULL)
{
if(pFast==pSlow)
break; //找到環;
pSlow=pSlow->next;
pFast=pFast->next;
if(pFast!=NULL)
pFast=pFast->next;
}
//計算環的個數;
while(pFast->next!=pSlow)
{
pFast=pFast->next;
NodeCount++;
}
return NodeCount;
}
//得到環的入口地址;
List *EntryNodeOfLoop(List *head,int count)
{
List *pNode1=head;
for(int i=0;i<count;i++)
pNode1=pNode1->next;
List *pNode2=head;
while(pNode1!=pNode2)
{
pNode1=pNode1->next;
pNode2=pNode2->next;
}
return pNode1;
}
int main()
{
int NodeCircle=0;
List *EnterNode=NULL;
CreateList(&pHead,arr,7);
cout<<"有環4567:";
show(pHead);
cout<<endl;
NodeCircle=GetNumOfCircle(pHead);
if(InputInvalid)
cout<<"THE INPUT IS INVALID@!"<<endl;
else
{
EnterNode=EntryNodeOfLoop(pHead,NodeCircle);
cout<<"環入口結點的值為:"<<EnterNode->data<<endl;
}
system("pause");
return 0;
}
執行結果如下:
相關文章
- PHPer也刷《劍指Offer》之連結串列PHP
- 劍指offer面試16 反轉連結串列面試
- 劍指OFFER-從頭到尾列印連結串列(Java)Java
- 劍指offer面試17 合併兩個排序的連結串列面試排序
- 劍指offer-從尾到頭列印連結串列-phpPHP
- 劍指offer——兩個連結串列的第一個公共結點C++C++
- 連結串列面試題(十一)---求帶環單連結串列 環的入口點面試題
- 劍指offer面試題15 連結串列中倒數第K個結點面試題
- 劍指 Offer 25. 合併兩個排序的連結串列 JavaScript實現排序JavaScript
- 劍指Offer面試題5(Java版):從尾到頭列印連結串列面試題Java
- 【LeetCode】【連結串列】劍指 Offer 52. 兩個連結串列的第一個公共節點 思路解析和程式碼LeetCode
- 劍指Offer-37-陣列中逆序對陣列
- 【劍指offer】樹的子結構
- 利用PHP實現《劍指 offer》之連結串列(資料結構與演算法實戰 )PHP資料結構演算法
- 劍指offer:刪去連結串列中重複的節點。(題解原始碼加圖解)原始碼圖解
- 劍指offer(java實現)第3題“從尾到頭列印連結串列”-牛客網Java
- 利用快慢指標快速得到連結串列中間節點指標
- mysql 索引十連問| 劍指 offer - mysqlMySql索引
- 【劍指offer】連續子陣列的最大和陣列
- 劍指offer-17:樹的子結構
- 劍指offer面試18 樹的子結構面試
- 【劍指offer】字串的排列字串
- 【劍指offer】【2】字串的空格字串
- 【劍指offer】字串的組合字串
- 劍指 Offer 42.連續子陣列的最大和陣列
- 劍指Offer-連續子陣列中的最大和陣列
- 指標和連結串列指標
- 劍指offer-JavaScript版JavaScript
- 【劍指offer】左旋轉字串字串
- 劍指Offer題解合集
- Linked List Cycle leetcode II java (尋找連結串列環的入口)LeetCodeJava
- 劍指 Offer 38. 字串的排列字串
- 劍指Offer 表示數值的字串字串
- 連結串列面試題(十)---求帶環單連結串列的環的長度面試題
- 《劍指Offer》- 連續子陣列的最大和或最小和陣列
- 劍指offer-例題 連續子陣列的最大和陣列
- 劍指 offer(1) -- 陣列篇陣列
- Leetcode劍指offer(八)LeetCode