题解 | #链表中的节点每k个一组翻转#
链表中的节点每k个一组翻转
http://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e
/**
- 关键思路:新的头结点 newNode, 新的头结点的标杆pointHead(方便最后返回结果)。
链表反转的时候反转前的节点 newHeadCur.
利用List,反转的时候从尾部读取,不用反转的时候从头部读取。 */
import java.util.*;
class ListNode { public ListNode(int val) { this.val = val; } int val; ListNode next = null; }
public class Solution {
public ListNode reverseKGroup (ListNode head, int k) {
// write code here
List<ListNode> listNodes = new ArrayList<>();
ListNode tempHead = head;
ListNode newHead = new ListNode(0);
// 记住起始位置
ListNode pointHead = newHead;
// 记录最后一个不为空的节点
ListNode newHeadCur = null;
while (head != null) {
listNodes.add(head);
head = head.next;
if (listNodes.size() == k) {
while (!listNodes.isEmpty()) {
ListNode stackNode = listNodes.remove(listNodes.size() - 1);
stackNode.next = null;
newHeadCur = stackNode;
newHead.next = stackNode;
newHead = newHead.next;
}
}
}
if (pointHead.next == null) {
return tempHead;
}
if (!listNodes.isEmpty()) {
newHeadCur.next = listNodes.get(0);
}
return pointHead.next;
}
public static void main(String[] args) {
Solution solution = new Solution();
ListNode listNode1 = new ListNode(1);
ListNode listNode2 = new ListNode(2);
ListNode listNode3 = new ListNode(3);
listNode1.next = listNode2;
listNode2.next = listNode3;
ListNode resNode = solution.reverseKGroup(listNode1, 2);
System.out.println(resNode.val);
}
}