思路:
(1)首先求解單鏈表的長度length,然後遍歷 length / 2 的距離即可查到單鏈表的中間節點,但一般此種方法需要遍歷兩次鍊錶,第一次遍歷求解單鏈表的長度,第二次遍歷根據索引獲取中間節點。
(2)如果是雙向鍊錶,可以首尾並行,利用兩個指標乙個從頭到尾,乙個從尾到頭,當兩個指標相遇的時候,就找到中間元素。以此思想為基礎,進一步思考,單鏈表也可以採用雙指標的方式來實現中間節點的快速查詢。但雙指標的使用和雙向鍊錶不同,具體如下:
<1> 有2個指標同時從頭開始遍歷;
<2> 乙個快指標一次走2步,乙個慢指標一次走一步。
<3> 快指標先到鍊錶尾部,而慢指標則恰好到達鍊錶中部;
快指標到達鍊錶尾部,當鍊表長度為奇數時,慢指標指向的就是鍊錶中間節點。當鍊表長度為偶數時,慢指標指向的節點和慢指標指向節點的下乙個節點都是鍊錶的中間節點。
具體實現見**:
#include
typedef struct node
node;
node *create_end(int arr, int len)
end->next = null;
return head;
}// 此方法適用於不帶頭節點的單鏈表的列印,對於帶頭節點的單鏈表要稍作處理。
void print(node *head)
}// 尋找單鏈表的中間節點
// 當鍊表中有偶數個元素時,最中間的兩個節點都可以算作中間節點;
// 但通過該方法查詢到的是前面那個節點;如{1,2,3,4,5,6},通過該方法查詢到的中間節點是3。
node *searchmid1(node *head)
return mid;
}// 尋找單鏈表的中間節點(對searchmid1略作修改)
// 當鍊表中有偶數個元素時,最中間的兩個節點都可以算作中間節點;
// 但通過該方法查詢到的是後面那個節點;如{1,2,3,4,5,6},通過該方法查詢到的中間節點是4。
node *searchmid2(node *head)
return mid;
}// 尋找單鏈表的中間節點(length)
// 當鍊表中有偶數個元素時,最中間的兩個節點都可以算作中間節點;
// 但通過該方法查詢到的是後面那個節點;如{1,2,3,4,5,6},通過該方法查詢到的中間節點是4。
node *searchmid3(node *head,int len)
return p;
}int main(int argc, const char * argv) ;
int len = sizeof(arr)/sizeof(int);
node *head = create_end(arr, len);
// 因為建立的鍊錶是帶頭節點的,所以此處列印要稍作處理;
node *first = head->next;
print(first);
printf("\n");
node *p1 = searchmid1(head->next);
printf("%d\n",p1->data);
node *p2 = searchmid2(head->next);
printf("%d\n",p2->data);
node *p3 = searchmid3(head->next, len);
printf("%d\n",p3->data);
return
0;}
尋找單鏈表的中間結點
如何尋找單鏈表的中間結點?這裡介紹兩種方法。該方法的思路為 1 先求解單鏈表的長度 length 2 然後遍歷 length 2 的距離即可查詢到單鏈表的中間結點。具體實現 public node findmidele node head return tmp 該方法的缺點 需要遍歷兩次鍊錶,即第一...
單鏈表求中間節點
難度 兩星 單鏈表求中間節點分為兩種情況 1 單鏈表長度為奇數時,如abcde,那麼中間節點就是c。2 單鏈表長度為偶數時,如abcdef,那麼中間節點有兩個c和d。本文簡單起見就取第二個中間節點。思想 其實思想很簡單,其實就是跟 判斷單鏈表儲存的字串是否為 回文串 中求中間節點的方法一模一樣,使用...
尋找中間節點
題目 尋找鍊錶的中間節點,如果鍊錶個數為奇數 則中間結點就是最中間的結點,如果為偶數,中間節點是中間兩個節點後面的那個結點 遍歷列表計算鍊錶長度 找到鍊錶的中間位置索引 遍歷到鍊錶,至到中間位置,返回中間位置 public listnode middlenode listnode head size...