一、題目:
假設(shè)遞增有序的帶頭結(jié)點的鏈表A、B分別表示一個集合,試設(shè)計算法以判斷集合A是否是集合B的子集,如是返回1,否則返回0。
二、思路:
1.A的值大于B的值,那就A的元素不變,B指向下一個元素,再比較;
2.A的值小于B的值,那就A指向下一個元素,B的元素不變,再比較;
3.A的值等于B的值,然后A,B同時指向下一個元素,而且n累加1;(此處的n最后用來與A鏈表的長度比較,若n=A鏈表的長度,則說明A的元素在B中全部都有,即A是B的子集)
三、思路的代碼:
public boolean gather(Node a,Node b){
Node A=a.next; //指向鏈表A的第一個結(jié)點
Node B=b.next; //指向鏈表B的第一個結(jié)點
int n=0; //用來計數(shù)
while(A!=null){
while(B!=null){
if(A.data<B.data){ //如果集合A的數(shù)值大于集合B中的數(shù)值
A=A.next;//A的指針指向下一個元素,B的指針不變,依舊是這個元素
break;//終止內(nèi)循環(huán),從外循環(huán)開始,A的在一個元素和B的本元素比較
}
if(A.data==B.data){//如果集合A的數(shù)值等于集合B中的數(shù)值
A=A.next; //A的指針指向下一個元素
B=B.next; //B的指針指向下一個元素
n++; //當n的值等于A集合的元素個數(shù),說明A是B的子集
break;
}
if(A.data>B.data){ //如果集合A的數(shù)值小于集合B的數(shù)值
B=B.next;//那么B的指針指向下一個元素,A的指針依舊是指向本元素
if(A.next==null&&B.next==null){
if(A.data==B.data)//A和B均為最后一個元素且相等,則計數(shù)
n++;
A=A.next; //如果A和B均為最后一個元素不相等, 則A指向空,讓外部循環(huán)停止
}
break;
}
}
}
if(n==List_Length(a)) //當n的值等于A集合的元素個數(shù),說明A是B的子集
return true;
else
return false;
}
四、完整程序的輸出結(jié)果:
①A為非空集合
A為非空集合
②A為空集合
A為空集