C語言面試題高階篇

2021-08-03 00:23:38 字數 2656 閱讀 9472

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 的儲存位置是在 記憶體的資料段 或靜態儲存區 中的,儲存在這個位置的值,是 允許修...