反轉單鏈表的幾種方法

2021-07-02 02:38:12 字數 2774 閱讀 7408

最近面試遇到了關於單項鍊表的問題

來乙個最常見的題目:反轉單鏈表。假設單鏈表的資料結構定義如下:

typedefstructlnode

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);

returnnewlist;

}

第二種方法是每次都將原第乙個結點之後的那個結點放在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)

returnlist;

}

第三種方法跟第二種方法差不多,第二種方法是將後面的結點向前移動到頭結點的後面,第三種方法是將前面的結點移動到原來的最後乙個結點的後面,思路跟第二種方法差不多,就不貼**了。

單鏈表反轉的幾種方法

反轉鍊錶,將單鏈表倒置輸出 這個也算是很多面試題裡常考的題,剛複習完單鏈表在這記錄一下這幾種方法,做個筆記 鍊錶反轉1 建立乙個新的鍊錶,遍歷原煉表頭插到新鍊錶 linkedlist listreverselist linkedlist l while temp node next start ne...

反轉單鏈表的幾種方法

題目 輸入乙個鍊錶的頭結點,反轉該鍊錶,並返回反轉後鍊錶的頭結點。鍊錶結點定義如下 1 2 3 4 5 structlistnode 分析 這是一道廣為流傳的微軟面試題。由於這道題能夠很好的反應出程式設計師思維是否嚴密,在微軟之後已經有很多公司在面試時採用了這道題。為了正確地反轉乙個鍊錶,需要調整指...

反轉單鏈表的幾種方法

最近試著做一些筆試面試題,既是為來年找工作做準備,也可以做為資料結構和演算法的複習筆記,就陸續發在這裡吧,有需要的朋友可以看一下,如果有沒考慮周全的地方歡迎指正。先來乙個最常見的題目 反轉單鏈表。假設單鏈表的資料結構定義如下 typedefstructlnode lnode,linkedlist 並...