题解 | #链表中的节点每k个一组翻转#
链表中的节点每k个一组翻转
https://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e
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 dummy = new ListNode(-1);
dummy.next = head;
ListNode foreNode = dummy;
ListNode leftNode = foreNode.next;
ListNode rightNode = leftNode;
ListNode backNode = leftNode;
//初始化固定节点
for (int i = 1; i < k; i++) {
rightNode = rightNode.next;
if (rightNode == null) return head;
}
while (leftNode != null && rightNode != null) {
backNode = rightNode.next;
//断开节点
foreNode.next = null;
rightNode.next = null;
//反转中间left-right节点
reverseListNode(leftNode);
//重新连接节点
foreNode.next = rightNode;
leftNode.next = backNode;
//重新固定节点
foreNode = leftNode;
leftNode = backNode;
if (leftNode == null) break;
rightNode = leftNode;
for (int i = 1; i < k; i++) {
rightNode = rightNode.next;
if (rightNode == null) break;
}
}
return dummy.next;
}
private ListNode reverseListNode(ListNode head) {
ListNode pre = null;
ListNode cur = head;
while (cur != null) {
ListNode curNext = cur.next;
cur.next = pre;
pre = cur;
cur = curNext;
}
return pre;
}
}
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 dummy = new ListNode(-1);
dummy.next = head;
ListNode foreNode = dummy;
ListNode leftNode = foreNode.next;
ListNode rightNode = leftNode;
ListNode backNode = leftNode;
//初始化固定节点
for (int i = 1; i < k; i++) {
rightNode = rightNode.next;
if (rightNode == null) return head;
}
while (leftNode != null && rightNode != null) {
backNode = rightNode.next;
//断开节点
foreNode.next = null;
rightNode.next = null;
//反转中间left-right节点
// reverseListNode(leftNode);
Deque<ListNode> deque = new LinkedList<>();
ListNode tempNode = leftNode;
for (int i=0; i<k; i++) {
deque.addLast(tempNode);
tempNode = tempNode.next;
}
ListNode reNode = deque.removeLast();
while (!deque.isEmpty()) {
reNode.next = deque.removeLast();
reNode = reNode.next;
}
reNode.next = null;
//重新连接节点
foreNode.next = rightNode;
leftNode.next = backNode;
//重新固定节点
foreNode = leftNode;
leftNode = backNode;
if (leftNode == null) break;
rightNode = leftNode;
for (int i = 1; i < k; i++) {
rightNode = rightNode.next;
if (rightNode == null) break;
}
}
return dummy.next;
}
private ListNode reverseListNode(ListNode head) {
ListNode pre = null;
ListNode cur = head;
while (cur != null) {
ListNode curNext = cur.next;
cur.next = pre;
pre = cur;
cur = curNext;
}
return pre;
}
}
