Python筆試練習題
阿新 • • 發佈:2020-10-20
給定一個單鏈表L:L0→L1→…→Ln-1→Ln ,
將其重新排列後變為: L0→Ln→L1→Ln-1→L2→Ln-2→…
你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。
示例1:
給定連結串列 1->2->3->4, 重新排列為 1->4->2->3.
示例 2:
給定連結串列 1->2->3->4->5, 重新排列為 1->5->2->4->3.
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/reorder-list
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
快慢指標找到連結串列中點,將前後部分斷開,後半部分反轉,然後依次插入前半部分
//快慢指標找連結串列中點,slow就是連結串列中點
ListNode* slow = head;
ListNode* fast = head;
while (fast->next && fast->next->next){
slow = slow->next;
fast = fast->next->next;
}
ListNode* reverseList(ListNode* head) { ListNode* ret = nullptr; while (head){ ListNode* next = head->next; head->next = ret; ret = head; head = next; } return ret; }
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: void reorderList(ListNode* head) { if (!head || !head->next) { return; } //快慢指標找連結串列中點,slow就是連結串列中點 ListNode* slow = head; ListNode* fast = head; while (fast->next && fast->next->next){ slow = slow->next; fast = fast->next->next; } //後半部分頭節點 ListNode* later = slow->next; //斷開前後部分 slow->next = nullptr; //反轉後半部分 later = reverseList(later); ListNode* front = head; while (front && later) { ListNode* frontNext = front->next; ListNode* laterNext = later->next; front->next = later; later->next = frontNext; front = frontNext; later = laterNext; } } //反轉連結串列 ListNode* reverseList(ListNode* head) { ListNode* ret = nullptr; while (head){ ListNode* next = head->next; head->next = ret; ret = head; head = next; } return ret; } };