25.K个一组翻转链表
# 25.K个一组翻转链表
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
输入:head = [1,2,3,4,5], k = 2 输出:[2,1,4,3,5]
- 第一步要先遍历一轮链表,找到最后一个不够k个节点的组的首节点,做法是设置一个计数器,每加到k就换一次首节点。这里注意遍历时候每次只能后移一个结点,跨两个在某些情况下容易出错。
- 第二步进行分组的反转,原理跟先前链表原地逆置差不多,只不过多了个分组,要把逆置后的组的尾节点设置为新的头结点(头插法),并且链接下一个组的头结点。phead是每个组的头结点,pend是每个组的尾结点。
public ListNode reverseKGroup(ListNode head, int k) {
ListNode p=head,rhead=null;
int group=1;
while(p!=null)
{
if(group==k)
{
rhead=p.next;
group=1;
p=p.next;
continue;
}
group++;
p=p.next;
}
ListNode phead=new ListNode(0,head),res=phead;
p=head;
group=0;
ListNode pnext,pend=null;
while(p!=rhead)
{
if(group==k)
{
phead=pend;
pend.next=p;
group=0;
}
pnext=p.next;
if(group==0)
{p.next=null;
pend=p;
}
else
p.next=phead.next;
phead.next=p;
p=pnext;
group++;
}
pend.next=rhead;
return res.next;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
编辑 (opens new window)
上次更新: 2023/12/15, 15:49:57