给你链表的头节点 head
,每 k
个节点一组进行翻转,请你返回修改后的链表。
k
是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k
的整数倍,那么请将最后剩余的节点保持原有顺序。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
力扣25https://leetcode-cn.com/problems/reverse-nodes-in-k-group/
思路:
首先,需要创建一个查找节点的函数,用来查找链表中的第k个值;
例如 1-2-3-4-5 假设给定的值为3,则查找后,返回的节点为3
然后,创建一个函数,用来翻转从start到end之间的节点;
例如 1-2-3-4-5 假设给定的值 为3,则反转后 3-2-1-4-5;
最后,在主函数中,每k个节点反转一次。
/**
* Definition for singly-linked list.//题目给的链表
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
ListNode start=head;
ListNode end=find(start,k);
if (end==null){
return head;//如果为空,则说明链表的长度不到k个节点,则不需要反转,直接返回头结点
}
head=end;//如果没有返回,则说明链表的长度在k个以上,k个节点反转后,头结点就是尾结点
fan(start,end);//反转前k个数。
ListNode lastEnd=start; //反转后的最后节点为开始的头结点
while (lastEnd.next!=null){//
start=lastEnd.next; //新开始的节点为K*n+1的节点位置
end=find(start,k);
if (end==null){//不到k个就返回头结点
return head;
}
fan(start,end);
lastEnd.next=end;
lastEnd=start;
}
return head;
}
public static ListNode fan(ListNode head,ListNode end){//反转从head到end的节点值
end=end.next;
ListNode a=head;
ListNode pre=head;
head=head.next;
ListNode l=null;
while (head!=end){//如果head==end,说明已经反转完成了。
l=head;
head=head.next;
l.next=pre;
pre=l;
}
a.next=end;
return l;
}
public static ListNode find(ListNode head,int k){//查找第k个节点并返回
ListNode end=head;
for (int i = 1; i < k; i++) {
if (end==null) return null;//如果没有到第k个值,则返回null
end=end.next;
}
return end;
}
}