面試題 求未知長度的鍊錶的中間節點(快慢指標)

2021-07-02 14:16:54 字數 1963 閱讀 2228

所謂的快慢指標的快慢是指指標向前移動的步長。比如在單鏈表中,快指標每次向前移動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 題目本身比較簡單,可...