單鏈表反轉

無頭的單鏈表反轉:

迭代實現的話,需要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; // 傳遞不變的新鏈表頭部指針
}

有頭結點的單鏈表反轉,相當於先把頭結點從原鏈表中斷開作爲新鏈表的頭,然後用頭插法的形式將後面的結點依次插入新鏈表中。

發佈了166 篇原創文章 · 獲贊 59 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章