無頭的單鏈表反轉:
迭代實現的話,需要pre和next。相當於把每個結點指向下一個結點的指針箭頭指向上一個結點或者空,然後返回指向原鏈表最後一個結點的指針。
ListNode *iterateReverseList(ListNode *l) {
ListNode *pre = nullptr, *next;
while (l) {
next = l->next; // 保存指向原鏈表的指針
l->next = pre; // 鏈表反轉指向pre, pre此時是新鏈表的尾部
pre = l; // pre移動到l, 保存新鏈表的部分
l = next;
}
return pre;
}
遞歸實現鏈表反轉:要明白,反轉的鏈表其頭結點一定是原鏈表的尾節點,不會變動。
ListNode *recurseReverseList(ListNode *l) {
if (l == nullptr || l->next == nullptr) return l;
newHead = recurseReverseList(l->next);
l->next->next = l; // 將l->next即新鏈表的尾部的next指針指向l
l->next = nullptr;
return newHead; // 傳遞不變的新鏈表頭部指針
}
有頭結點的單鏈表反轉,相當於先把頭結點從原鏈表中斷開作爲新鏈表的頭,然後用頭插法的形式將後面的結點依次插入新鏈表中。