题目链接
[题解]
模拟就好.
就 k 个 k 个节点地翻转.
每个节点都把 next 域指向它前面那个节点
修改完之后把这个节点前面的那个节点的 next 域改成这一段的最后一个节点.
然后把这一段最左边的那个节点的 next 域修改为下一个区间的开始位置.
[代码]
- /**
- * 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) {
- ListNode *thead = new ListNode(0);
- thead->next = head;
- ListNode *temp = thead;
- int len = 0;
- while (temp->next!=NULL){
- temp = temp->next;
- len++;
- }
- temp = thead;
- for (int i = 1;i <= len/k;i++){
- ListNode *pre = temp;
- ListNode *p = temp,*tp = temp->next;//tp 保存修改到的节点的 next, 因为 next 会变了
- for (int j = 1;j <= k;j++){
- p = tp;
- tp = p->next;
- p->next = pre;// 把当前节点的 next 域指向前面一个节点
- pre = p;// 保存 pre 节点.
- }
- temp->next->next=tp;// 要修改的这段的最左边的节点 next 域改一下
- ListNode *t2 = temp->next;
- temp->next = pre;// 这段要修改的区间的最左边的左边一个节点的 next 域指向这一段的最右边那个节点
- temp = t2;// 指向这一段 "新的最右边的节点"(也即原来的第一个节点)
- }
- return thead->next;
- }
- };
来源: http://www.bubuko.com/infodetail-3280001.html