题目:按k个结点一组来反转链表
思路:
运用反转链表的通法reverse,对链表进行循环,当计数长度k不时,指针继续前进;当计数长度到达k时,将该组首尾节点first和node作为参数传入翻转函数reverse进行翻转,然后重新拼接到原链表中。直至到达链表末尾。
代码如下:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
if(head == null||head.next == null||k<=1)
return head;
ListNode node=head;
ListNode helper=new ListNode(0);//创建一个辅助的头结点;
helper.next=head;//当k> length of list时,返回原链表;
ListNode lastgroup=helper;//记录上一组结点的尾结点;
ListNode nextgroup=head;//辅助记录下一组结点的首结点;
ListNode first=nextgroup;//记录下一组结点的首结点;
int count=1;
while(node!=null)
{
if(count<k)
{
count++;
node=node.next;
}else//count == k;
{
nextgroup=node.next;
lastgroup.next=reverse(first,node);
lastgroup=first;
first.next=nextgroup;
first=nextgroup;
node=first;
count=1;
}
}
return helper.next;
}
//字符串反转通用方法;
public ListNode reverse(ListNode head,ListNode tail)
{
ListNode pre=head;
ListNode cur=head.next;
ListNode ne=null;
while(pre!=tail)
{
ne=cur.next;
cur.next=pre;
pre=cur;
cur=ne;
}
head.next=null;
head=pre;
return head;
}
}