所謂的快慢指標的快慢是指指標向前移動的步長。比如在單鏈表中,快指標每次向前移動2個步長,慢指標則每次向前移動1個步長。
快速找出未知長度的鍊錶的中間節點,暴力解法就是先遍歷真個鍊錶,算出鍊錶的長度,再從頭遍歷長度的一半,即可找出,不過這個比較費時。更巧妙的辦法是運用快慢指標,將快慢指標先指向頭結點,快指標移動2個步長,慢指標移動1個步長,當快指標指向鍊錶末尾的時候,慢指標剛好就在中間節點上。
void find_mid(linklist l)
p = l->next;
count = 0;
while (p)
p = l->next;
mid = count / 2 ;
for (i = 0; i < mid; i++ )
printf("%d\n", p->data);
}
void find_mid2(linklist l)
fast = slow = l;
while(fast->next !=
null
&& fast->next->next !=
null)
slow = slow->next;
printf("%d\n", slow->
data);
}
#include
#include
#include
#define ok 1
#define error 0
#define true 1
#define false 0
typedef struct node node, *linklist;
/*隨機產生n個元素的帶表頭的單鏈表(頭插法)*/
void creatlist_head(linklist *l, int n)
(*l)->next = null;
for (i = 0; i < n; i++)
p->data = rand() % 100 + 1;
p->next = (*l)->next;
(*l)->next = p;
}}/*隨機產生n個元素的帶表頭的單鏈表(尾插法)*/
void creatlist_tail(linklist *l, int n)
r = (*l);
for (i = 0; i < n; i++)
p->data = rand() % 100 + 1;
r->next = p;
r = p;
}r->next = null;
}void print_list(linklist l)
p = l->next;
while (p)
printf("\n");
}void print_list_nohead(linklist l)
p = l;
while (p)
printf("\n");
}void find_mid(linklist l)
p = l->next;
count = 0;
while (p)
p = l->next;
mid = count / 2 ;
for (i = 0; i < mid; i++ )
printf("%d\n", p->data);
}void find_mid2(linklist l)
fast = slow = l;
while(fast->next != null && fast->next->next != null)
slow = slow->next;
printf("%d\n", slow->data);
}int main(int argc, char const *argv)
演算法面試題 快速找到未知長度單鏈表的中間節點
有道演算法面試題 快速找到未知長度單鏈表的中間節點。你可以普通方法也可用比較好的方法,去解決這個問題。由於單鏈表不知道長度,必須遍歷完整個單鏈表才知道單戀表的長度,然後根據一般的長度去找中間結點,這是普通方法。當然題目問的是快速找到,當然要用快速的方法啦。這裡我們快慢指標的方法來解決這個問題,快指標...
查詢未知鍊錶長度的中間結點
眾所周知,鍊錶是不知道長度的,如果想知道長度只能通過遍歷一遍鍊錶才可得知,因此對於查詢未知鍊錶長度的中間結點可以有很多方法。最簡單的方法就是通過遍歷一邊鍊錶得到長度l,再通過遍歷l 2的鍊錶得到中間結點,此時時間複雜度就是o l l 2 而另一種更簡便方法則為通過建立兩個指標,第乙個指標為第二個指標...
鍊錶演算法面試題 返回鍊錶的中間節點
給定乙個非空鍊錶的頭節點,從該鍊錶的中間節點開始返回。如果中間節點有兩個,則返回第二個中間節點。1 2 3 4 5 null,中間節點為3,所以返回3 4 5 null。1 2 3 4 5 6 null,中間節點為3 4,根據要求返回第二個中間節點,所以返回4 5 6 null 題目本身比較簡單,可...