最近試著做一些筆試面試題,既是為來年找工作做準備,也可以做為資料結構和演算法的複習筆記,就陸續發在這裡吧,有需要的朋友可以看一下,如果有沒考慮周全的地方歡迎指正。
先來乙個最常見的題目:反轉單鏈表。假設單鏈表的資料結構定義如下:
typedef
struct
lnode
lnode, *linkedlist;
並且這個單鏈表有乙個頭指標list指向第乙個結點,最後乙個結點指向null,很容易理解。
最容易想到的第一種方法就是重新建立乙個單鏈表newlist,每次將list中的第乙個結點放到newlist後面。注釋比較詳細,所以就不具體說了,直接看**吧:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
linkedlist reversesinglylinkedlist(linkedlist list)
//
//初始化newlist
//
newlist->data = list->data;
newlist->next = null;
//
//依次將list的第乙個結點放到newlist的第乙個結點位置
//
while
(list->next != null)
//
//原頭結點應該釋放掉,並返回新頭結點的指標
//
free
(list);
return
newlist;
}
第二種方法是每次都將原第乙個結點之後的那個結點放在list後面,下圖是原始的單鏈表。
為了反轉這個單鏈表,我們先讓頭結點的next域指向結點2,再讓結點1的next域指向結點3,最後將結點2的next域指向結點1,就完成了第一次交換,順序就變成了header-結點2-結點1-結點3-結點4-null,然後進行相同的交換將結點3移動到結點2的前面,然後再將結點4移動到結點3的前面就完成了反轉,思路有了,就該寫**了:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
linkedlist reversesinglylinkedlist(linkedlist list)
tmp = list->next;
while
(tmp->next != null)
return
list;
}
第三種方法跟第二種方法差不多,第二種方法是將後面的結點向前移動到頭結點的後面,第三種方法是將前面的結點移動到原來的最後乙個結點的後面,思路跟第二種方法差不多,就不貼**了。
反轉單鏈表的幾種方法
最近面試遇到了關於單項鍊表的問題 來乙個最常見的題目 反轉單鏈表。假設單鏈表的資料結構定義如下 typedefstructlnode lnode,linkedlist 並且這個單鏈表有乙個頭指標list指向第乙個結點,最後乙個結點指向null,很容易理解。最容易想到的第一種方法就是重新建立乙個單鏈表...
單鏈表反轉的幾種方法
反轉鍊錶,將單鏈表倒置輸出 這個也算是很多面試題裡常考的題,剛複習完單鏈表在這記錄一下這幾種方法,做個筆記 鍊錶反轉1 建立乙個新的鍊錶,遍歷原煉表頭插到新鍊錶 linkedlist listreverselist linkedlist l while temp node next start ne...
反轉單鏈表的幾種方法
題目 輸入乙個鍊錶的頭結點,反轉該鍊錶,並返回反轉後鍊錶的頭結點。鍊錶結點定義如下 1 2 3 4 5 structlistnode 分析 這是一道廣為流傳的微軟面試題。由於這道題能夠很好的反應出程式設計師思維是否嚴密,在微軟之後已經有很多公司在面試時採用了這道題。為了正確地反轉乙個鍊錶,需要調整指...