1、题目描述
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.
k is a positive integer and is less than or equal to the length of the linked list. If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.
Example:
Given this linked list: 1->2->3->4->5
For k = 2, you should return: 2->1->4->3->5
For k = 3, you should return: 3->2->1->4->5
Note:
Only constant extra memory is allowed.
You may not alter the values in the list’s nodes, only nodes itself may be changed.
2、问题描述:
- 将一个链表进行k长度的翻转,每k个节点翻转一次,如果不足k个则不动。
3、问题关键:
- 1.注意链表断链问题。
- 2.先判断够不够k个节点,如果够,就一次翻转k个,建立三个指针,a, b, c, a指向第一个,b第二个,c第三个,再让b指向a,再让a指针移到b,b移到c,c指向下一个,c的左右是记录下一个防止断链。
- 3.建立虚拟头结点,防止断链,
4、C++代码:
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
if (!head) return head;
ListNode* dummy = new ListNode(-1);
dummy->next = head;
auto cur = dummy;
while(cur) {//cur只需要遍历一次。
int s = 0;
for (auto i = cur->next; i ; i = i->next) s ++;//判断当前链表长度是否足够进行翻转。
if (s < k) break;
s = 0;
auto a = cur->next, b = a->next;//指向当前的第一个结点和下要给结点。
while(s < k - 1)
{
s ++;
auto c = b->next;//记录下一个结点翻防止断链. a----->b ------>c;
b->next = a;
a = b, b= c;
}
auto p = cur->next;//记录翻转前的头结点,也就是翻转后的最后一个结点。
cur->next->next = b;//将翻转后的前链表的最后一个元素指向下一个链表的头。
cur->next = a;//将上个链表的最后一个结点指向当前链表的头。
cur = p;//cur 指向下一个链表的头。
}
return dummy->next;
}
};