1. 程式人生 > 實用技巧 >876.連結串列的中間結點

876.連結串列的中間結點

給定一個頭結點為head的非空單鏈表,返回連結串列的中間結點。如果有兩個中間結點,則返回第二個中間結點。連結串列為無頭結點、單向、不迴圈。(由於涉及到結構體,所以寫不了完整的測試程式碼,下面展示的程式碼為LeetCode中寫的程式碼)

//第一次嘗試:
//方法一:做兩次迴圈,第一次計數有多少個節點,記為count;第二次迴圈獲取到第count/2+1個節點的資料;
//方法二:快慢指標,設定兩個指標fast、slow,初始時都指向首節點,然後fast每次走兩步,slow每次走一步,當fast走到連結串列結尾,slow正好指向中間的節點,這樣一次迴圈就可以做到
struct
ListNode* middleNode(struct
ListNode* head){ //常規做法,兩次迴圈 if(head->next == NULL){ return head; } struct ListNode* node = head;
//第一次迴圈計數count
int count = 0; while(node){ node = node->next; count++; }
//找到中間位置 count
= count/2 + 1; while(count > 1){ head
= head->next; count--; } return head; //快慢指標法 struct ListNode* fast = head; struct ListNode* slow = head; while(fast != NULL&&fast->next != NULL){
//快指標一次走兩步,慢指標一次走一步 slow
= slow->next; fast = fast->next->next; } return
slow; }