给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。//Leetcode 25
例如:有链表:1->2->3->4->5 输入k值2
可得链表 2->1->4->3->5
解决思路:今天学到的是通法解决,重点就是要构造有虚拟头节点的链表。然后就可以分批翻转链表。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
ListNode dummy = new ListNode(0);//构造虚拟头结点
dummy.next=head;
ListNode pre=dummy;//代翻转位置的前驱结点
ListNode end=dummy;//代翻转位置的最后结点
while(end.next!=null){
for(int i=0;i<k && end!=null;i++){
end=end.next;
}
if(end==null){
break;
}
ListNode next=end.next;//保存断开位置节点的后续链接
end.next=null;//断开连接
ListNode start=pre.next;//代翻转位置的开始结点
pre.next=reverse(start);
start.next=next;//连接前面断开的连接
pre=start;
end =start;
}
return dummy.next;
}
public ListNode reverse(ListNode head){
if(head.next==null||head==null){
return 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;
}
}