题目描述
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例:
给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
思路:
思路参考王小二的题解
- 翻转每组链表时,首先拿到这段链表的前一个与后一个的结点用来后面拼接。
- 遍历得到每段链表的起始与结尾结点,写一个方法专门用来翻转两个结点之间这段距离的链表。
- 在遍历寻找结尾结点时,若结点为空,说明到头来,不用反翻转了,把剩余的结点和前面已经拼接的链表连起来。
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
if(head == null || head.next == null || k == 1){
return head;
}
ListNode dummy = new ListNode(0);
ListNode pre = dummy;
ListNode start = head;
ListNode end = head;
ListNode tail = null;
while(true){
for(int i = 1; i < k; i++){
if(end == null){
break;
}
end = end.next;
}
if(end == null){
break;
}
tail = end.next;
pre.next = reverse(start,end);
pre = start;
end = tail;
start = tail;
}
pre.next = start;
return dummy.next;
}
public ListNode reverse(ListNode a,ListNode b){
ListNode cur = a.next;
a.next = null;
while(cur != b){
ListNode temp = cur.next;
cur.next = a;
a = cur;
cur = temp;
}
b.next = a;
return b;
}
}