1.判斷單鏈表是否帶環?若帶環,求環的長度?求環的入口點?
首先判斷是否帶環,在這裡用快慢指標,快指標每次走兩步,慢指標每次只走一步,無環的快指標會先走到頭,如果快指標等於慢指標那麼說名單鍊錶存在環,會返回
相遇點,如果無環會返回
空指標。為什麼乙個走兩步乙個走一步就可以呢,
因為fast比slow走的快,所以進入環是fast一定在slow前面(或相遇),假設領先n步,fast每次必slow先走一步,所以每走一次倆者間距離減少為n-1步,最後倆者一定會相遇,如果走三步或則三步以上有可能快慢指標會錯過。
//assert(plist&&plist->next);
//listnode* fast = plist->next->next;
//listnode* slow = plist;
//while (fast!=slow)
////if (fast==slow)
////return null;
listnode* iscycle(listnode *plist)//是否帶環
if (fast==slow)
else
}
求環的長度,根據上一步返回的相遇點,我們可以把這個指標的值給乙個臨時指標,給乙個count,讓它再走一圈,當等於相遇點的時候就是走了一圈,此時count裡面存的就是環的長度。
int getcyclelen(listnode *meetnode)//獲得環長度
return count;
}
環的入口點,在這裡有乙個推論
由上面的推論可以得到,相遇點和單鏈表起始點距離環的入口點距離是一樣的,那麼我們讓定義兩個指標從相遇點和起始點分別走,那麼最後它們必然在入口點相遇。
listnode* getcycleentry(listnode *plist,listnode *meetnode)//獲得環入口
return cur;
}
測試如下:
2.判斷兩個鍊錶是否相交,若相交,求交點。(假設鍊錶不帶環)
兩個單鏈表相交只有一種情況,演算法如下
1判斷倆鍊錶是否相交,同時找到倆鍊錶的尾節點看他們是否指向同一塊空間。
2找交點,算出倆鍊錶的長度差gap,然後讓長的鍊錶指標向前走gap步,另一鍊錶指標指向頭,倆指標同時開始走,當指向同一塊空間時就為交點。
3如果倆鍊錶中,有為空即沒有交點。
listnode* cressnoc(listnode* plist1, listnode* plist2)//無環鏈表是否相交
while (tail2->next)
if (tail1 != tail2)
return null;
int gap = abs(count1 - count2);
listnode *cur1 = plist1;
listnode *cur2 = plist2;
if (count1 > count2)
} else
} while (cur1 != cur2)
return cur1;
}
3.判斷兩個鍊錶是否相交,若相交,求交點。(假設鍊錶可能帶環)【公升級版】
這裡總共有四種情況:
1:兩者都無環,有可能相交有可能不相交,復用之前寫的關於無環鏈表判斷相交的函式
2:乙個有環乙個無環必不相交
兩個都有環,又分為3,4,5情況
3:兩個都有環,將環的入口點判為最後點,轉換為判斷無環函式相交點
4:兩個都有環,交點在環的內部,定義快慢指標,分別從兩個入口點走,一圈之內必然相交,若一圈之內未相交,則沒有交點
listnode* cressmc(listnode* plist1, listnode* plist2)//可能帶環鍊錶是否相交
//2:乙個有環乙個無環
else if(p1==null||p2==null)
return null;
//都有環
else
while (tail2->next!=entry2)
listnode* cur1=plist1;
listnode* cur2=plist2;
int gap=abs(count2-count1);
if (count1>count2)
}else
}while (cur1!=cur2)
return cur1;
} //4 交點在環內
else
if (fast==slow)
else
} }}
C語言面試題五 Intel篇
intel a.c 和b.c兩個c檔案中使用了兩個相同名字的static變數,編譯的時候會不會有問題?這兩個static變數會儲存到 棧還是堆或者其他的 static的全域性變數,表明這個變數僅在本模組中有意義,不會影響其他模組。他們都放在資料區,但是編譯器對他們的命名是不同的。如果要使變數在其他模...
C語言面試題 指標篇(一)
指標的使用,一直是c語言面試題中必考的部分,因為指標本身使用的複雜性與普適性,所以考點非常多,而且也可以與其他知識相互結合,因此我們將會使用五篇專題的篇幅來介紹指標。分析下面的程式,指出程式中的錯誤 include int main void 沒有正確為str分配記憶體空間,將會發生異常。問題出在將...
C語言面試題 指標篇(二)
閱讀下面的程式,找出其中的錯誤,並說明原因。include int main 答案 該程式會段錯誤,因為程式中僅僅只定義 乙個字元指標,並沒有定義字元 只是將字元指標指向 abcd 這個字元 常 而字元 常 abcd 的儲存位置是在 記憶體的資料段 或靜態儲存區 中的,儲存在這個位置的值,是 允許修...