力扣-25.K个一组翻转链表
题目链接
25.K个一组翻转链表
class Solution {public ListNode reverseKGroup(ListNode head, int k) {ListNode hair = new ListNode(0);hair.next = head;ListNode tail = hair;ListNode pre = hair;while (tail != null) {for (int i = 0; i < k; i++) {tail = tail.next; if (tail == null) { //这里不够k个不做操作直接返回return hair.next;}}ListNode nex = tail.next;ListNode[] res = reverse(head, k);//拼接回原链表pre.next = res[0];res[1].next = nex;//调整三指针pre、head、tailpre = res[1];head = nex;tail = res[1];}return hair.next;}public ListNode[] reverse(ListNode head, int k) {ListNode hair = new ListNode(0);ListNode p1 = head;ListNode p2 = head;while (k > 0) {p2 = p1.next;p1.next = hair.next;hair.next = p1;p1 = p2;k--;}return new ListNode[]{hair.next, head};}
}
小结:第一遍能够做出来,但是代码比较冗余且不够熟练。主要有以下几点需要注意:
- 变量名要有意义,如额外头结点
hair
,反转部分的链表头head
,链表尾tail
,以及暂存的指针pre
和nex
用于反转后拼接。 - 自己写的
reverse
函数可以同时返回反转后的链表头和链表尾组成数组,避免寻找链表尾时额外遍历。