鏈表是基本的數據結構之一,面試題中鏈表占很大一部分,可見鏈表操作是非常重要的。我對一些常見的鏈表操作進行的歸納。
下面的問題為:查找單鏈表的中間節點。
題目分析:
鏈表的特點就是有很多的節點,每個節點有數據域和指針域兩部分,指針域存放的是下一個節點的地址,根據地址找到下一個節點。鏈表只能從前到后遍歷,不能從后到前遍歷。
對於這個問題,我們首先能夠想到的就是先遍歷一遍整個的鏈表,然后計算出鏈表的長度,進而遍歷第二遍找出中間位置的數據。這種方式非常簡單。
若題目要求只能遍歷一次鏈表,那又當如何解決問題?可以采取建立兩個指針,一個指針一次遍歷兩個節點,另一個節點一次遍歷一個節點,當快指針遍歷到空節點時,慢指針指向的位置為鏈表的中間位置,這種解決問題的方法稱為快慢指針方法。(面試盡量用這種方式,能夠提高印象分)
下面為具體的核心算法:
- //查找單鏈表的中間節點,要求只能遍歷一次鏈表
- SListNode * FindMidNode(SListNode * phead)
- {
- SListNode *fast = phead;
- SListNode *slow = phead;
- while (fast)
- {
- if (fast->next != NULL)
- {
- fast = fast->next->next;
- }
- else
- {
- break;
- }
- slow = slow->next;
- }
- return slow;
- }
- 也可以這樣寫,更為簡潔
- while (fast&&fast->next )
- {
- fast = fast->next->next;
- slow = slow->next;
- }
本文出自 “無心的執着” 博客,轉載請與作者聯系!