24. 兩兩交換鏈表中的節點

自己做
解:直接置換

/*** 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 *p = head;if(p == nullptr) //空鏈表return nullptr;if(p->next == nullptr) //只有一個元素return head;//先交換前兩位ListNode *q = p->next; ListNode *r = q->next;p->next = r; q->next = p;head = q; //更新頭指針指向的結點q = p->next;if(q != nullptr)r = q->next;elser = nullptr;//三英杰就位,交換?啟動!while(r != nullptr){//交換p->next = r;q->next = r->next;r->next = q;//更新pqr位置p = q;q = p->next;if(q == nullptr)break;r = q->next;}return head;}
};

25. K 個一組翻轉鏈表

自己做
?解:頭插反轉合并

/*** 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* reverseKGroup(ListNode* head, int k) {ListNode *p = head;ListNode *r = new ListNode(); //頭插//統計鏈表長度int len = 0;while(p != nullptr){p = p->next;len++;}if(len < k) //連一組k都湊不出來return head;if(k == 1) //不用交換return head;//先處理第一組p = head; //重置指針p(上面用來統計長度了)ListNode *q = p->next;ListNode *tail = p; //重新排序好的鏈表尾指針for(int i = 0; i < k; i++){ p->next = r->next; //頭插r->next = p;p = q;if(p != nullptr)q = q->next;}head = r->next; //重置頭結點len -= k; //長度更新(這個長度表示剩下要排序的元素個數)while(len >= k){r->next = nullptr; //重置頭插鏈表ListNode *end = p; //end指向頭插鏈表的尾部for(int i = 0; i < k; i++){ p->next = r->next; //頭插r->next = p;p = q;if(p != nullptr)q = q->next;}//現在r指向的頭插鏈表又填裝好了,p也指向了下一組的起始位置tail->next = r->next; //反轉的部分和原先的鏈表合并(head指向的)tail = end; //更新taillen -= k; //更新長度}//湊不成一組的部分合并tail->next = p;return head;}
};
