题目
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.
k is a positive integer and is less than or equal to the length of the linked list. If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.
Given this linked list: 1->2->3->4->5
For k = 2, you should return: 2->1->4->3->5
For k = 3, you should return: 3->2->1->4->5
思路
这道题的意思是每K个节点一组翻转链表,如果最后还剩不够K个,就维持不变。
那么思路也很明显,每K个一组反转就行,考虑到之前做过的翻转链表,先试一下能不能直接拿来用,翻转函数得到的是一个新链表,如果进行每K个一组得到一个新链表,就要进行链表的拼接,而链表拼接必须有尾指针,这样以来每一次拼接都需要遍历链表,比较麻烦,所以把之前的函数修改一下。
通常反转一个链表需要加一个头结点,将取下来的节点接在头结点后面。再定义一个指针要么指向要取下来的节点,要么指向root节点后面的节点。这里我们定义成root节点后面的节点,因为循环完一轮之后,指针一动可能造成空指针异常。,因此有了如下代码
ListNode node = head.next;
root.next=head.next;
head.next=root.next.next;
root.next.next=node;
加上for(inti=0;i<k-1:i++)循环,这里注意,循环只进行了k-1次,k-1个节点移动到第一个节点的前面,循环完毕后head指向一开始的第一个节点,node没变,root没变。考虑剩余节点情况,剩余节点的数量很可能小于K甚至为0,所以下一遍循环之前要进行判断剩余节点的数量,最简单的方法就是数出所有节点的数量,每次循环减去K自然得到剩余节点数量。
while(count>=k)
for(int i=0;i<k-1;i++){
ListNode node = root.next;
root.next=head.next;
head.next=root.next.next;
root.next.next=node;
}
root=head;
head=root.next;
count=count-k;
}
核心代码完成,补充上各种变量即可。
tips
Memory Limit Exceeded 这个错误基本不是由与变量定义太多造成的,大概率是程序逻辑有问题。