25.K 个一组翻转链表
题目:给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
说明:
你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
Reverse函数:
1.设置结点pre为空,curr为头结点,next为空cur不为空时进行循环
2.next为cur的next
3.cur的next为pre
4.cur赋值给pre,next赋值给cur(移动指针进行下一次循环)
5.返回pre(pre在反转后为头结点)
reverseKGroup:
1.设置哑结点,哑结点指向head
2.设置指针pre为哑结点,start为头结点,next为头结点
next不为空时进行循环
3.for循环,利用K找到end,要注意链表是否结束即end不为空,为空时表示不满足K个长度。如果end为空,则break循环。
4.pre和start已经在预计位置,next需指向end的next,将end的next置为空并且end指向与start一致。
5.start = reverse(start)来对k的元素进行反转。并且start指向了新的头结点。
6.接着end 指向next,pre指向start。(内部K个反转完成后,新的头结点和尾结点与外部边界连接)
7.重新制定pre,start,end。pre为end,start为next,end为start。
class Solution {
public:
ListNode * reverse(ListNode * head)
{
ListNode * pre = NULL;
ListNode * cur = head;
ListNode * next = NULL;
while(cur != NULL)
{
next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
return pre;
}
ListNode* reverseKGroup(ListNode* head, int k)
{
ListNode * dummy = new ListNode(0);
dummy->next = head;
ListNode * pre = dummy;
ListNode * start = head;
ListNode * end = head;
ListNode * next = head;
while(next != NULL)
{
for(int i = 1 ; i < k && end != NULL; i++)
{
end = end->next;
}
if (end == NULL)
{
break;
}
next = end->next;
end->next = NULL;
end = start;
start = reverse(start);
end->next = next;
pre->next = start;
//重新初始化
pre = end;
start = next;
end = start;
}
return dummy->next;
}
};