即長爲n的列表中,以k(0 < k < n)個元素爲一組進行反轉,餘下不變。
如: 1->2->3->4->5
k = 2: 2->1->4->3->5
k = 3: 3->2->1->4->5node
以k個元素爲一趟,遍歷子鏈,記錄前面結點,後面結點,將當前結點的next指向前面節點便可。
可設置哨兵結點,以消除第一趟的處理。spa
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* reverseKGroup(ListNode* head, int k) { if (k <= 1) return head; ListNode _node(0), *root = &_node; _node.next = head; // 哨兵結點 do { ListNode *te = head; for (int i = k; --i; te = te->next) if (!te) return _node.next; if (!te) return _node.next; root->next = te; root = head; ListNode* prev = te = te->next; while (head != te) { ListNode* tmp = head->next; head->next = prev; prev = head; head = tmp; } } while (true); } };
主要是考察指針操做。指針