K个节点一组,反转链表;
private Node reverse(Node pre, Node next){
Node last = pre.next;
Node cur = last.next;
while(cur != next){
last.next = cur.next;
cur.next = pre.next;
pre.next = cur;
cur = last.next;
}
return last;
}
public Node reverseK(Node head, int k){
if(head == null || head.next == null || k < 1){
return head;
}
Node dummy = new Node(-1);
dummy.next = head;
Node pre = dummy;
Node cur = head;
int cnt = 0;
while(cur != null){
cnt++;
Node next = cur.next;
if(cnt == k){
pre = reverse(pre, next);
cnt = 0;
}
cur = next;
}
return dummy.next;
}
还有一种思路,用双向队列。当队列中的node个数小于k时,不需要倒序,直接输出;当队列中的个数等于k时,从队尾获取元素。
public ListNode reverseK(ListNode head, int k){
if(head == null || k <=1){
return head;
}
Dequeue<ListNode> st = new ArrayDequeue<>();
ListNode dummy = new ListNode(0);
ListNode p = dummy;
while(true){
int cnt = 0;
ListNode tmp = head;
while(tmp != null && cnt <k){
st.add(tmp);
cnt ++;
tmp = tmp.next;
}
if(k != cnt){
p.next = head;
break;
}
while(!st.isEmpty()){
p.next = st.pollLast();
p = p.next;
}
p.next = tmp;
head = tmp;
}
return dummy.next;
}