C言語強化(七)チェーンテーブル交差問題_4 2つのループチェーンテーブルが交差しているかどうかを判断する
3383 ワード
前節が終わった後、チェーンテーブルにループがあるかどうかを判断することができます.ループがない場合は、前の2節で述べた方法でチェーンテーブルが交差しているかどうかを判断し、交差点を取得します.ループがある場合は?交差するかどうかをどう判断しますか?
タイトル
h 1,h 2のような2つの一方向チェーンテーブルのヘッダポインタを与え、この2つのチェーンテーブルが交差しているかどうかを判断する.
解題手順は、2つの【無環】チェーンテーブルが交差するか否かを判断する .は2つの【無環】チェーンテーブルの交差点 を見つけた.チェーンテーブルにリングがあるか否かを判断する .は、2つの【有環】チェーンテーブルが交差するか否かを判断する .[ループ付き]チェーンテーブルの交差点 が2つ見つかりました.
構想
リングのあるチェーンテーブルでは、それらが交差している限り、リングのあるセグメントは必ず完全に繰り返されます.したがって、チェーンテーブル1にリング上のノードを見つけて、そのノードがチェーンテーブル2上にあるかどうかを判断し、存在する場合は交差し、存在しない場合は交差しません.
では、どうやって「チェーンテーブルの上にリングの上のノードが見つかりました」を見つけますか?
そう、前に作成したチェーンテーブルがループ関数を持っているかどうかを判断し、チェーンテーブルがループを持っている場合、ループ上のノードを返します.
上記の考え方に基づいて、2つの関数を新しく作成する必要があります.
関数1:ノードがチェーンテーブルにあるかどうかを判断する
関数2:ループチェーンテーブルが交差しているかどうかを判断する
ソース:
リングチェーンテーブルが交差しているかどうかを判断することができます.残りはリングチェーンテーブルが交差しているノードを得ることです.次のセクション、チェーンテーブルが交差している問題の最後のセクションです.
.
転載先:https://www.cnblogs.com/javdroider/p/5184292.html
タイトル
h 1,h 2のような2つの一方向チェーンテーブルのヘッダポインタを与え、この2つのチェーンテーブルが交差しているかどうかを判断する.
解題手順
構想
リングのあるチェーンテーブルでは、それらが交差している限り、リングのあるセグメントは必ず完全に繰り返されます.したがって、チェーンテーブル1にリング上のノードを見つけて、そのノードがチェーンテーブル2上にあるかどうかを判断し、存在する場合は交差し、存在しない場合は交差しません.
では、どうやって「チェーンテーブルの上にリングの上のノードが見つかりました」を見つけますか?
そう、前に作成したチェーンテーブルがループ関数を持っているかどうかを判断し、チェーンテーブルがループを持っている場合、ループ上のノードを返します.
上記の考え方に基づいて、2つの関数を新しく作成する必要があります.
関数1:ノードがチェーンテーブルにあるかどうかを判断する
/*
head
node
*/
bool ifNodeOnList(ListNode * head,ListNode * node){
if(node==NULL)
return 0;
// ,
ListNode * circleNode = ifCircle(head);
int count = 0;//
while(head!=NULL&&count<2){
if(head==node)
return 1;
if(head==circleNode)
count++;
head=head->nextNode;
}
return 0;
}
関数2:ループチェーンテーブルが交差しているかどうかを判断する
//
bool ifCircleListCross(ListNode * L1,ListNode * L2){
ListNode * node = ifCircle(L1);
if(node!=NULL)
return ifNodeOnList(L2,node);
return 0;
}
ソース:
#include
#include
#include
using namespace std;
/**
4. 【 】
,【 】。
, , , 。
*/
/**
*/
struct ListNode{
int data;
ListNode * nextNode;
ListNode(ListNode * node,int value){
nextNode=node;
data=value;
}
};
ListNode * L1;
ListNode * L2;
/**
node
: , 1, 2, ,
NULL
*/
ListNode * ifCircle(ListNode * node){
if(NULL==node)
return false;
ListNode * fast = node->nextNode;
ListNode * slow = node;
while(NULL!=fast&&NULL!=fast->nextNode){
fast=fast->nextNode->nextNode;// 2
slow=slow->nextNode;// 1
if(fast==slow){
cout<nextNode;
}
return 0;
}
//
bool ifCircleListCross(ListNode * L1,ListNode * L2){
ListNode * node = ifCircle(L1);
if(node!=NULL)
return ifNodeOnList(L2,node);
return 0;
}
//
ListNode * createCircleList(){
ListNode * node = new ListNode(NULL,0);
ListNode * enter = node;
node = new ListNode(node,1);
node = new ListNode(node,2);
enter->nextNode=node;
node = new ListNode(node,3);
node = new ListNode(node,4);
return node;
}
//
void createCircleListCross(){
L1 = new ListNode(NULL,0);
ListNode * enter2 = L1;//L2
L1 = new ListNode(L1,1);
L1 = new ListNode(L1,2);
enter2->nextNode=L1;//L1
L1 = new ListNode(L1,3);
L1 = new ListNode(L1,4);
L2 = new ListNode(enter2,0);
L2 = new ListNode(L2,1);
L2 = new ListNode(L2,2);
}
//
void createCircleListNotCross(){
L1=createCircleList();
L2=createCircleList();
}
void main()
{
/*
ListNode * node = createCircleList();
ListNode * node2 = new ListNode(NULL,0);
cout<
リングチェーンテーブルが交差しているかどうかを判断することができます.残りはリングチェーンテーブルが交差しているノードを得ることです.次のセクション、チェーンテーブルが交差している問題の最後のセクションです.
.
転載先:https://www.cnblogs.com/javdroider/p/5184292.html