出現位置:第一輪基礎類筆試或技術一面
難度係數:中
面試題目:
實現乙個單鏈表的反轉。例如:
10 9 8 7 6 5 4 3 2 1
反轉後應該為:
1 2 3 4 5 6 7 8 9 10
要求10分鐘內寫出**,注意**風格及時間複雜度/空間複雜度。
考點分析:
(1)基本概念:鍊錶基礎,**規範問題,**健壯性問題。
(2)對時間複雜度的敏感。
解題思路:
「一問,二畫,三答」
一問:問清題目,跟面試官交流,找出面試官看重什麼,出題的目的是什麼。
二畫:不先寫**,先理清思路,在紙上畫一畫。
初步思路如下:
1、額外再申請乙個鍊錶,使用前插入的方法即可。(涉及到空間複雜度的問題)
2、先找最後乙個,再找倒數第二個。(涉及到時間複雜度的問題)
所以,以上兩條都不滿足條件。這時就得和面試官交流是不是重點考察複雜度的問題。
有的面試官直接要求時間複雜度為o(n)。
則可以有下面的解題思路:
next = temp->next; //乙個初始狀態
temp->next = prew; //改變指標的指向,實現反轉
temp = next; //後移一位
prev = temp;//後移一位
迴圈的條件是temp!=null
寫出規範的**的話,需要考慮特殊情況:
1、null的時候
2、1個節點的時候
**如下:
#include
#include
typedef struct node//定義了乙個鍊錶的結構體
lnode, *linklist;//typedef 是用後面的兩個名字替代結構體型別名
linklist link_insert(linklist p,int num)
temp->idata=num;
temp->next=p;
p=temp;
return p;
}void link_print(linklist temp)
printf("\n");
}linklist reverse_link(linklist list)
return prev; //返回最後乙個節點,prev指向最後乙個節點,它變成了新的鍊錶的頭
}int main()
printf("在反轉後:\n");
head = reverse_link(head);
link_print(head);
return 0;}
面試題 單鏈表反轉
問題 定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出反轉後鍊錶的頭結點。一 非遞迴演算法 假設有鍊錶a b c d e f g。在反轉鍊錶過程中的某一階段,其鍊錶指標指向為 a b c d e f g。也就是說在結點d之前的所有結點都已經反轉,而結點d後面的結點e開始的所有結點都沒有反轉。這樣...
鏈表面試題 反轉單鏈表
反轉乙個單鏈表。示例 輸入 1 2 3 4 5 null 輸出 5 4 3 2 1 null解決方案 頭插法開闢新鍊錶並逐個讀取舊鍊錶,頭插進新鍊錶,這樣新的鍊錶與原鍊錶的結構就是反的,需要借助輔助空間 definition for singly linked list.struct listnod...
開心IT面試題 單鏈表排序 反轉
一 單鏈表排序 仿照基於陣列的氣泡排序演算法 node sorting linklist node node node result int temp 0 int len length linklist node result node for int j 0 j len j result resu...