LeetCode---876.連結串列的中間結點
阿新 • • 發佈:2018-11-10
題目來源:https://leetcode-cn.com/problems/middle-of-the-linked-list/description/
題目描述:
該題目有兩種做法,第一種比較容易想到,但是時間複雜度較高。
第一種:
這種做法比較簡單,先遍歷一遍連結串列計算出連結串列的結點個數,然後跑到length/2的位置就行了
程式碼如下:
struct ListNode* middleNode(struct ListNode* head) { if(head==NULL||head->next==NULL){ return head; } int length=0; struct ListNode* p; for(p=head;p;p=p->next){ length++; } p=head; for(int i=0;i<length/2;p=p->next,i++); return p; }
第二種:
這個做法就是利用兩個指標,一個快指標,一個慢指標。兩個指標從head開始遍歷。快指標一次跑兩步,慢指標一次跑一步。當快指標遍歷完一個連結串列之後,慢指標就跑到了中間節點。然後再根據題目要求修改(因為當節點個數為偶數時,有時候要求是靠前的節點,有時要求靠後的結點。本題要求的是靠後的結點)。
程式碼如下:
struct ListNode* middleNode(struct ListNode* head) { if(head==NULL||head->next==NULL){ return head; } struct ListNode* fastp=head; struct ListNode* slowp=head; while(fastp->next&&fastp->next->next){ fastp=fastp->next->next; slowp=slowp->next; } if(fastp->next){ return slowp->next; }else{ return slowp; } }