- 题目描述:
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
进阶:
你可以设计一个只使用常数额外空间的算法来解决此问题吗?
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
-
示例:
-
解题思路:
1.先设虚拟固定头结点dummy(0),指向头结点,并设cur和next指针,指向head节点,设pre=dummy.
2.设k=3,链表每三个数一组进行翻转:
1)移动next指针到cur的下一位
next = cur.next;
2)当前cur指向此时next的下一位,即a从原来的指向b,转而指向c
cur.next = next.next;
3)此时next指针指向pre下一个节点(a),即b节点指向a节点(原来b是指向c的)
next.next = pre.next;
4)最后把pre指向此时的next节点,即pre->b
这时的链表为:
pre.next = next;
再进行下一轮循环:
此时就将a->b->c转换成c->b->a,下一个区间,pre来到a节点,cur来到d节点,循环下去即可。
代码如下:
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
ListNode dummy = new ListNode(0), pre = dummy, cur = head, next;
dummy.next = head;
int length = 0;
while(head != null) {
length++;
head = head.next;
}
head = dummy.next;
for(int i = 0; i < length / k; i++) {
for(int j = 0; j < k - 1; j++) {
next = cur.next;
cur.next = next.next;
next.next = pre.next;
pre.next = next;
}
prev = cur;
cur = pre.next;
}
return dummy.next;
}
}