这题非常适合拿来当练习题
详细题解来源:(转载)
public ListNode reverseKGroup(ListNode head, int k) {
ListNode temp = new ListNode(0);// 引入头结点方便所有结点的统一处理,不需要对第一个k进行特殊处理
temp.next = head;
ListNode crrNode = temp;
ListNode preNode = temp;
while (true) {
for (int i = 0; i < k && crrNode != null; ++i) {
crrNode = crrNode.next;
}
if (crrNode == null) {
break;
}
ListNode begin = preNode.next;
ListNode next = crrNode.next;
preNode.next = reverse(begin, crrNode);
begin.next = next;
preNode = begin;
crrNode = begin;
}
return temp.next;
}
private ListNode reverse(ListNode begin, ListNode end) {
end.next = null;
ListNode preNode = null;
ListNode crrNode = begin;
while (crrNode != null) {
ListNode nextNode = crrNode.next;
crrNode.next = preNode;
preNode = crrNode;
crrNode = nextNode;
}
return preNode;// 返回逆置后的尾部结点
}
相比起原解法,多封装了一个end的null处理,while的条件也没必要进行判断,直接true即可。这样代码思路会更清晰
比较需要技巧的是注意倒置和不要断链
这个解法还可以进行优化,即直接翻转,如果最后一个不到k段,还原即可。
但个人觉得,作为一个通用解法,这是一个适合于上机和面试的比较好的思路,首先是比较基本的链表逆置reverse函数,可以作为本题的一个基准
就像我们组装电脑一样,真在面试和上机过程中,成熟的稳定的组装更有助于解题