Reverse Nodes in k-Group
问题简介:
给定链表,反转链表中每k个节点并返回其修改后的链表.
注:k是正整数,如果节点数不是k的倍数,那么最后的剩余节点应该保持不变.
举例:
给定的链表: 1->2->3->4->5
当 k = 2, 输出: 2->1->4->3->5
当 k = 3, 输出: 3->2->1->4->5
链表结构:
// Definition for singly-linked list.
public class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
解法一:
当k=1为输入链表本身,当k大于链表即返回链表本身,将链表添加到集合中,每k个元素进行截取反转并添加到新集合中,将新集合输入到结果链表中
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
if(k < 1)return null;
if(k == 1)return head;
int length = 0;
ListNode len = head;
List<Integer> list = new ArrayList<>();
while(len!=null){
length++;
list.add(len.val);
len = len.next;
}
List<Integer> result = new ArrayList<>();
for(int i = 0;i<length;i=i+k){
if( i+k > length ){
List l = list.subList(i,length);
result.addAll(l);
}else{
List l = list.subList(i,i+k);
Collections.reverse(l);
result.addAll(l);
}
}
ListNode listNode = new ListNode(0);
ListNode ln = listNode;
for(int j=0;j<length;j++){
ln.next = new ListNode(result.get(j));
ln = ln.next;
}
return listNode.next;
}
}
复杂度分析:
时间复杂度:o(n)都是单层遍历
空间复杂度:o(n)最大为n次定义集合元素
注:
List list = new ArrayList();
1.截取list的一部分:
List result = list.subList(1,n)
截取的是list集合中索引1到n-1的值,数学中的左闭右开,[1,n)
2.集合list的反转
Collections.reverse(list)
小白刷题之路,请多指教— — 要么大器晚成,要么石沉大海