輸入單鏈表頭節點,原地反轉鏈表,返回新頭節點。節點定義:
struct ListNode {
int m_nKey;
ListNode* m_pNext;
};
創建新頭節點 newList,遍歷原鏈表,將每個節點從原鏈表摘下,插入 newList 之後(即新鏈表頭部)。最終釋放原頭節點。
LinkedList ReverseSinglyLinkedList(LinkedList list) {
LinkedList newList = (LinkedList)malloc(sizeof(LNode));
if (!list || !newList) return NULL;
newList->data = list->data;
newList->next = NULL;
while (list->next) {
LNode* tmp = newList->next; // 保存新鏈表後續
newList->next = list->next; // 摘下原第一個節點
list->next = list->next->next; // 原鏈表跳過該節點
newList->next->next = tmp; // 恢復新鏈表後續
}
free(list);
return newList;
}
維持原頭節點不動,依次將「當前第一個節點的下一個節點」移動到頭節點之後。
圖解過程:
初始:Header → 1 → 2 → 3 → 4 → NULL
第1輪:移動 2 到 Header 後 → Header → 2 → 1 → 3 → 4
第2輪:移動 3 到 Header 後 → Header → 3 → 2 → 1 → 4
第3輪:移動 4 到 Header 後 → Header → 4 → 3 → 2 → 1 → NULL
LinkedList ReverseSinglyLinkedList(LinkedList list) {
if (!list) return NULL;
LNode* tmp = list->next;
while (tmp->next) {
LNode* p = tmp->next; // 要前移的節點
tmp->next = p->next; // tmp 跳過 p
p->next = list->next; // p 指向原第一個
list->next = p; // 頭節點指向 p
}
return list;
}
思路與方法二對稱:將原鏈表前段節點依次移動到原尾節點之後。代碼結構相似,不再贅述。