描述
给你一个链表以及一个k,将这个链表从头指针开始每k个翻转一下。
链表元素个数不是k的倍数,最后剩余的不用翻转。
样例
给出链表 1->2->3->4->5
k = 2, 返回 2->1->4->3->5
k = 3, 返回 3->2->1->4->5
代码
整体思路是每隔k个节点,进行逆置,随后拼接。
/**
* Definition for ListNode
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
/**
* @param head: a ListNode
* @param k: An integer
* @return: a ListNode
*/
public ListNode reverseKGroup(ListNode head, int k) {
// write your code here
if(head==null||head.next==null||k==1){
return head;
}
int count=0;
ListNode s=null;
ListNode newHead=null,tail=null;
for(ListNode node=head;node!=null;){
if(count==0){
s=node;
node=node.next;
}
else if(count==k-1){
ListNode temp2=node;
node=node.next;
temp2.next=null;
count=-1;
ListNode node3=reverse(s);
if(newHead==null){
newHead=node3;
}else{
tail.next=node3;
}
tail=s;
}else{
node=node.next;
}
count++;
}
if(tail!=s){
tail.next=s;
}
return newHead;
}
private ListNode reverse(ListNode head){
if(head==null){
return null;
}
ListNode pre=null;
while(head!=null){
ListNode next=head.next;
head.next=pre;
pre=head;
head=next;
}
return pre;
}
}