【链表】牛客网:链表内指定区间反转_暮色_年华的博客-CSDN博客
思路:
创建一个dummyNode虚拟节点和尾结点,分len/k组,每组进行翻转后用尾插法插入dummyNode链表。
字符串翻转:
private void reverseLinkedList(ListNode head){
ListNode dummyNode=new ListNode(-1);
ListNode p=head;
while(p!=null){
ListNode q=p.next;
p.next=dummyNode.next;
dummyNode.next=p;
p=q;
}
dummyNode.next=null;
}
注意:如果翻转的只是链表的局部,需要用额外的指针记录子链表的pre和next节点。
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
public ListNode reverseKGroup(ListNode head,int k){
if(k<=1)return head;
if(head==null)return head;
ListNode node=head;
int len=length(head);
ListNode dummyNode=new ListNode(0);
ListNode tail=dummyNode;
int n=len/k;
ListNode left=head;
ListNode right=head;
ListNode right_next=head;//必须初始化为head
for(int i=0;i<n;i++){
for(int j=0;j<k-1;j++){
right=right.next;
}
right_next=right.next;
right.next=null;
reverseLinkedList(left);
tail.next=right;
tail=left;
left=right=right_next;
}
tail.next=right_next;
return dummyNode.next;
}
public int length(ListNode head){
int cnt=0;
if(head!=null)cnt=1;
while(head.next!=null){
cnt++;
head=head.next;
}
return cnt;
}
private void reverseLinkedList(ListNode head){
ListNode dummyNode=new ListNode(-1);
ListNode p=head;
while(p!=null){
ListNode q=p.next;
p.next=dummyNode.next;
dummyNode.next=p;
p=q;
}
dummyNode.next=null;
}
}