Java演算法面試題(001) 如何使用迴圈和遞迴計算單連結串列的長度

劉近光發表於2017-11-23

本文為本博主翻譯,未經允許,嚴禁轉載。

簡介

這是我第一次接受跨國投資銀行面試時所問的經典程式設計問題之一。之後,這個問題在其他程式設計工作面試中也多次被問到。讓這個問題有趣的是,與C ++開發人員相比,Java開發人員在資料結構方面並不是那麼棒,這顯然是因為這兩種語言之間的根本區別。 C ++更多的是系統程式語言,而Java更多的是應用程式程式設計,也有一套豐富的Java API允許程式設計師跳過這種基本的程式設計技術。
順便說一句,如果你正在準備面試程式設計和尋找更多的編碼或演算法的問題,例如陣列,字串或其他資料結構,你可以隨時搜尋這個部落格。
如果你喜歡讀書,那麼你也可以看看Craking the Coding Interview,其中包含150個程式設計問題和解決方案。對於初學者,中級和有經驗的程式設計師來說,這是最好的編碼問題集合之一。它包含來自基本和高階資料結構的問題,如雙向連結串列,二叉樹,自平衡樹和二進位制堆。

2種在Java中查詢連結串列長度的方法

無論如何,讓我們回到這個問題,大家都知道,在單連結串列中,最後一個元素會指向“null”元素,所以第一個答案大部分時間是“我將使用一個計數器並遞增,直到達到元素的結尾“。
一旦到達連結串列的末尾,計數器的值將等於所遇到的元素的總數,即元素的長度。

這裡是示例程式碼來實現這個演算法,你可以使用本文給出的連結串列實現來理解這個問題。我們假設連結串列類擁有頭部的引用,這是一個指向連結串列中第一個節點的指標。要了解關於連結串列資料結構的更多資訊,可以選擇一本很好的資料結構和演算法方面書,例如Thomas Cormen的<<Introduction to Algorithms>>。

迭代方案

	public int length() {
		int count = 0;
		Node current = head;
		
		while (current != null) {
			count++;
			current = current.next();
		}
		
		return count;
	}
如果你沒有任何困難地回答這個問題,大多數面試官會要求你為這個問題寫一個“遞迴”的解決方案,只是為了檢查你如何處理遞迴,如果你的第一個答案是遞迴的,他們會要求你寫一個“迭代解決方案“。
現在,這裡是如何使用Java中的遞迴找到單連結串列的長度:

遞迴方案

    public int length(Node current) {
        if (current == null) {
            return 0;
        }

        return 1 + length(current.next());
    }
你可以看到我們已經使用了最後一個節點將指向null來終止遞迴,在編寫遞迴解決方案時識別這種情況非​​常重要,否則程式將永遠不會終止並導致StackOverFlowError。

原文連結

How do you find length of a Singly Linked list using Loop and Recursion

相關文章