赞
踩
题目来源:Leetcode K个一组翻转链表
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例:
给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
说明:
要想解决该问题需要解决如下几个问题:
伪代码
pre = p = start_position //start_position开始寻找K个一组节点的第一个结点位置
for i = 1 to k
p = p->next;
if p is NULL
break
在介绍之前首先说明一些使用到的指针(pre和p上面已经介绍):
设之前已经翻转了几组数据,此时curhead执行在处理完的序列的末尾:
curp->next = curhead->next; curhead->next = curp
)设K = 3,原始元素列表为1->2->3->4->5->6->7,则经过一次处理后的链表如下图所示
第二次处理第一步:将处理好的序列与未处理的序列断开,并将p的后一结点用rear指向
第二次处理第二步:从K个一组序列取出第一个结点,连接到与curhead相邻的下一位置
第二次处理第三步:取出第二个结点,连接到curhead相邻的下一位置
第二次处理第四步:取出最后一个结点,连接到curhead相邻的下一位置
第二次处理第五步:将curhead指针移动至当前已处理序列的末尾,并将未处理的指针序列连接在其后,然后重新初始化pre和p进行下一次处理
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* reverseKGroup(struct ListNode* head, int k) { struct ListNode* pre, * p; struct ListNode *rear, * curhead,*curp; int i; curhead = (struct ListNode*)malloc(sizeof(struct ListNode)); pre = p = head; while (p) { for (i = 1; i < k; i++) { if (!p) break; p = p->next; } if (p) { rear = p->next; curhead->next = NULL; if (pre == head) head = curhead; while (pre != rear) { curp = pre; pre = pre->next; curp->next = curhead->next; curhead->next = curp; } while (curhead->next) { curhead = curhead->next; } curhead->next = rear; p = pre; } } return head->next; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。