相信大家學完LinkList之後都想實際練習一下,我們再來透過Medium題目挑戰自己吧!
今天有點趕,先放上兩篇,希望有機會能再多放一題!
Medium
交換每兩個相鄰節點並返回
首先,我們會在鍊錶的最前面添加一個假的節點,讓這個假節點的下一個指向原始的頭節點,這樣我們可以更好地處理交換操作。
接下來,我們需要使用三個指標來幫助我們進行交換。這三個指標分別是:
最後,我們要按照順序來移動這些指標,確保交換順利進行。
為了確保我們不會丟失指向下一個節點的連接,我們需要按照這樣的順序進行:
這樣就完成一次交換了
最後就是移動指標到下一次位置
/**
* 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:
ListNode* swapPairs(ListNode* head) {
ListNode *prenode;
ListNode *n1,*n2;
if(head == nullptr || head->next == nullptr)
return head;
ListNode *node = new ListNode();
node->next = head;
prenode = node;
n1 = prenode->next;
n2 = n1->next;
while( n1 != nullptr && n2 != nullptr){
prenode->next = n2;
n1->next = n2->next;
n2->next = n1;
prenode = n1;
n1 = prenode->next;
if(n1 != nullptr && n1->next != nullptr)
n2 = n1->next;
else
break;
}
return node->next;
}
};
Medium
將一個LinkList 的奇數點連在一起,偶數點連在一起,再將點串在一起
就像在跳格子一樣,我們可以遍歷連結串列,但不是每次都前進一步,而是跳過一個節點,然後將跳過的節點連接起來。這樣,奇數位置的節點和偶數位置的節點就分別連在一起了。
最後,我們只需要將奇數部分和偶數部分的連結串列再連接在一起,就完成了整個操作。
/**
* 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:
ListNode* oddEvenList(ListNode* head) {
if (head == nullptr|| head->next == nullptr) {
return head;
}
ListNode* even = head->next;
ListNode *odd = head;
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;
}
};
明天會開始進入下一個單元拉! 有什麼更好的解法也歡迎大家來留言喔~~