题解 | #链表中的节点每k个一组翻转#
链表中的节点每k个一组翻转
http://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e
/** 1、先求链表的长度,通过len / k算出要反转多少段 2、进行每段反转,每段的头结点通过反转之后 还为下一段的头结点 需要记录每段的头结点 /* Solution() : res(new ListNode(-1)){} ~Solution(){ delete res; } ListNode *res; ListNode* reverseKGroup(ListNode* head, int k) { ListNode *p, *q, *l; //p为每次分段的头结点 l记录每段的头结点 为下一段的头结点 q = head; //q为临时节点 int len = 0; //链表的长度 p = res; if(!head) return NULL; while(q) { len++; q = q->next; } int cnt = len / k; //旋转段数 q = head; if(cnt <= 0 && head) //不足反转次数 直接返回 return head; while(cnt > 0) { int i = k; while(head && i> 0) { if(k == i) { //记住第一个元素位置 为下一段的头结点 l = q; } q = head->next; head->next = p->next; p->next = head; head = q; i--; } p = l; cnt--; } if(head) { l->next = head; } return res->next; }