資料結構-單鏈表進階之快慢指標原理(快速查詢法)
阿新 • • 發佈:2019-02-10
面試題:快速找到未知長度單鏈表的中間節點?
這個問題的解決方法分為普通方法和高階方法。
1.普通方法即我們大家都能一下子想到的,首先遍歷一遍獲取總長度L,然後再次遍歷迴圈至L/2即可;時間複雜度為:
O(L+L/2)=O(3/2L)
程式碼簡單實現:
typedef struct { int data; LNode *next; }LNode,*LinkList; /* function:普通方法 首先遍歷一遍獲取總長度L,然後再次遍歷迴圈至L/2即可 */ LNode *getElement(LinkList L) { if (L == NULL) { return NULL; } int i = 1; LNode *p = L->next; while (p!=NULL) { p = p->next; i++; } int j = 1; int mid = i / 2; LNode *midNode = L->next; while (j<mid) { midNode = midNode->next; } return midNode; }
2.高階方法:快慢指標法,設定2個指標*faster,*mid都指向單鏈表的頭節點,其中faster移動的速度為mid的2倍,當faster移動到末尾,mid即在中間位置了,以下是簡單實現:
/* function:快速查詢未知長度單鏈表中間節點 快慢指標法 */ LNode *fasterGetElement(LinkList L) { LNode *mid, *faster; mid = L->next; faster = L->next; while (faster!=NULL) { mid = mid->next; //faster = faster->next->next faster = faster->next; faster = faster->next; } return mid; }