單鏈表倒置可以說是面試中提問率最高的題目了。網上有很多單鏈表倒置的算法,但是實現解釋的不是很清晰。總結了一些算法之后,把我自己認為好理解的簡單方便的算法整理下來,方便以后自己復習。
1.迭代
下面的代碼及注釋應該很好的解釋了頭插法來實現單鏈表倒置的思路。
1 Node* Reverse(Node* node) 2 { 3 Node* prev = NULL; // 用於保存當前鏈表的頭結點
4 Node* tmp = NULL; // 用於保存當前節點的next
5 while (node != NULL) 6 { 7 tmp = node->_next; // 保存當前節點的next
8
9 node->_next = prev; // 將當前節點插入到頭結點前
10 prev = node; // 插入之后將當前節點設置為頭節點
11
12 node = tmp; // next為下次迭代的當前節點
13 } 14 return prev; // 循環結束后,p即為倒置后的頭結點
15 }
2.遞歸
遞歸來實現倒置最直接的描述就是入棧出棧,鏈表節點從頭結點開始依次入棧,最后到尾節點入棧結束;開始出棧:尾節點最先出棧,出棧時依次將兩個相鄰的節點交換指向;出棧結束后,整個鏈表的倒置就完成了。重要的地方是將最先出棧的尾節點返回,這就是倒置后的鏈表的頭結點。
1 Node* Reverse_recursive(Node* node) 2 { 3 // 停止條件
4 if (node->_next == NULL) 5 return node; // 表示到最后一個節點,返回這個節點當作頭結點 6
7 // 遞歸
8 Node* prev = Reverse_recursive(node->_next); 9
10 // 操作
11 Node* tmp = node->_next; // 保存當前節點next
12 tmp->_next = node; // 將當前節點放到其next之后
13 node->_next = NULL; // 將當前節點的next置為NULL
14
15 return prev; 16 }
