
題目解析:把鏈結串列正中間的節點刪除,並回傳修改後的串列
解題思路:設一快一慢兩個指標,慢指標走一步,快指標先從第三個節點起步走兩步。丟進迴圈跑,快指標走到底時,慢指標會剛好停在中間節點的前一位。把中間節點跳過並刪除,回傳頭節點
class Solution{
public:
ListNode* deleteMiddle(ListNode* head){
if(head->next == nullptr) return nullptr;
ListNode* n = head;
ListNode* m = head->next->next;
while(m != nullptr && m->next != nullptr){
n = n->next;
m = m->next->next;
}
ListNode* mid = n->next;
n->next = mid->next;
delete mid;
return head;
}
};

題目解析: 把鏈結串列依位子的奇偶數分組,讓奇數位節點排前面,偶數位節點排後面,回傳重新排列的串列
解題思路: 把第一個節點當奇數指標,第二個當偶數指標,並記住偶數串列的頭。丟進迴圈跑,把奇數指標連向偶數的下一個並往前走;偶數指標也連向奇數的下一個並往前走。最後把奇數串列尾巴接上偶數串列的頭,回傳頭節點
class Solution {
public:
ListNode* oddEvenList(ListNode* head) {
if(head == nullptr || head->next == nullptr) return head;
ListNode* odd = head;
ListNode* even = head->next;
ListNode* evenHead = even;
while(even != nullptr && even->next != nullptr){
odd->next = even->next;
odd = odd->next;
even->next = odd->next;
even = even->next;
}
odd->next = evenHead;
return head;
}
};

題目解析: 將給定的單向鏈結串列整個反轉過來,回傳反轉後的新頭節點
解題思路: 設指標n為空值當前節點,指標m指向現在的頭節點。丟進迴圈跑,先把m的下一個暫存起來,把m的箭頭反轉指向n。接著把n跟m都往後移一個位子。迴圈跑完後回傳n
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* n = nullptr;
ListNode* m = head;
while(m != nullptr){
ListNode* p = m->next;
m->next = n;
n = m;
m = p;
}
return n;
}
};