题解 | #链表中的节点每k个一组翻转#
链表中的节点每k个一组翻转
https://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
/*
之前做过一次,强迫症的我想着能不能一次遍历(我这里的代码是两次遍历)就搞定,磕了好久没做出来。这里说下这里的思路吧。
首先要对翻转链表很熟悉,p、q、r三指针翻转链表。而每k个进行翻转,中间的就是一段链表(而不是一个单独的节点),所以应该使用两个指针标定中间一段链表的头和尾(相当于q指针一分为二了)。先创建一个冗余头节点,这样比较好操作。每次就是让pre指针(pre的后继就是subHead)后移,然后让subTail在pre后面后移k次,并检查subTail是不是null。标定subHead、rear(也就是subTail的后继)之后,pre、subHead、subTail、rear四个指针保持不变,然后从subHead顺序遍历并翻转子链表,翻转完了之后更改上述四个指针的指向就可以了。
*/
class ListNode {
int val;
ListNode next;
public ListNode() {
next = null;
}
public ListNode(int v) {
val = v;
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;
ListNode pre = new ListNode();
pre.next = head;
ListNode subTail = pre;
head = pre;
while(subTail != null) {
for(int i = 0; i < k; i++) {
subTail = subTail.next;
if(subTail == null) break;
}
if(subTail != null) {
ListNode subHead = pre.next, rear = subTail.next;
ListNode p = subHead, q = subHead.next; //保持四个标定位置的指针不变
while(q != rear) {
ListNode r = q.next;
q.next = p;
p = q;
q = r;
}
pre.next = subTail; //更改子链表的头尾节点的连接
subHead.next = rear;
pre = subHead;
subTail = subHead;
}
}
return head.next;
}
}
#23届找工作求助阵地#
查看9道真题和解析