或许不安或许迷惑,但迷雾遮挡不住前方的光亮,有梦可待。
题目
给你链表的头节点 head
,每 k
**个节点一组进行翻转,请你返回修改后的链表。
k
是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k
**的整数倍,那么请将最后剩余的节点保持原有顺序。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
![](https://img.haomeiwen.com/i7172850/31f57f6c6ce56f76.png)
输入:head = [1,2,3,4,5], k = 2
输出:[2,1,4,3,5]
解题思路
-
分段反转:每次反转
k
个节点并连接新的反转段。
分段反转
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
//计算链表长度
int len = 0;
for(ListNode tmp = head;tmp!=null;tmp=tmp.next,len++);
//枚举位置
ListNode dummy = new ListNode(0,head),tmp = dummy;
for(int i = 0; i + k - 1 < len;i+=k) {
//反转[i,i+k-1]
ListNode pre = null,cur = tmp.next;
for(int m = 0; m < k; m++) {
ListNode next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
//链接下一段开头
ListNode tmpNext = tmp.next;
tmp.next.next = cur;
tmp.next = pre;
tmp = tmpNext;
}
return dummy.next;
}
}
复杂度分析
- 时间复杂度:
O(n)
,遍历两次链表。 - 空间复杂度:
O(1)
。
网友评论