题目链接:https://leetcode.com/problems/reverse-nodes-in-k-group/
这是一道hard级别的链表逆转题目,但是不难。把链表相关的easy和medium的做完再做这个应该很轻松。24. Swap Nodes in Pairs、206. Reverse Linked List、92. Reverse Linked List II这几个题目可以先做一下,如果没啥问题做这个也就是小case。另外本题也会用到206. Reverse Linked List的链表反转操作,链表反转代码如下:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
if(head==null||head.next==null)
return head;
ListNode rear=null,p=head;
ListNode front=head.next;
while(front!=null)
{
p.next=rear;
rear=p;
p=front;
front=front.next;
}
p.next=rear;
return p;
}
}
在使用上面的代码时需要调整一下,整个代码如下:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public static ListNode reverseKGroup(ListNode head, int k) {
if(head==null || head.next==null)
return head;
ListNode virtual=new ListNode(0);
virtual.next=head;
int count=k;
ListNode front=head,rear=head,before=virtual,behind=virtual;
while(rear.next!=null)
{
while(rear.next!=null && count>1)
{
rear=rear.next;
count--;
}
if(count>1)
break;
if(rear.next!=null)
{
behind=rear.next;
rear.next=null;
}
else
{
before.next=reverseList(front);
break;
}
before.next=reverseList(front);
front.next=behind;
before=front;
front=behind;
rear=behind;
count=k;
}
return virtual.next;
}
public static ListNode reverseList(ListNode front) {
ListNode virtual=new ListNode(0);
virtual.next=front;
ListNode p=front.next;
while(p!=null)
{
front.next=p.next;
p.next=virtual.next;
virtual.next=p;
p=front.next;
}
return virtual.next;
}
}
效率Beat 100%!!!爽歪歪!