标签:25 head ListNode temp 结点 链表 tail leetcode 翻转
解法
思路:
大致过程可以分解为
1、找到待翻转的k个节点(注意:若剩余数量小于 k 的话,则不需要反转,因此直接返回待翻转部分的头结点即可)。
2、对其进行翻转。并返回翻转后的头结点(注意:翻转为左闭又开区间,所以本轮操作的尾结点其实就是下一轮操作的头结点)。
3、对下一轮 k 个节点也进行翻转操作。
4、将上一轮翻转后的尾结点指向下一轮翻转后的头节点,即将每一轮翻转的k的节点连接起来。
代码:
class Solution {
public ListNode reverse(ListNode head, ListNode tail){
//这个翻转链表不是reverseAll,也不是reversePart,是从head reverse到tail
ListNode temp1 = null;
ListNode temp = head;
ListNode temp2;
while (temp != tail){
temp2 = temp.next;
temp.next = temp1;
temp1 = temp;
temp = temp2;
}
return temp1;
}
public ListNode reverseKGroup(ListNode head, int k) {
//先反转第一组的,因为要保存好newHead
//用循环定位到tail
ListNode tail = head;
for (int i = 0; i < k; i++){
if(tail == null){
//如果该组的长度不够k,就不用翻转了,直接返回该组的head
return head;
}
tail = tail.next;
}
//此时定位到要反转的部分了,从head到tail(不包括tail)
//用newHead保存新的头
ListNode newHead = reverse(head, tail);
//此时head还是原始链表的头部,也就是翻转后第一组的尾部,用它去连接第二组
//第二组的头部是tail
head.next = reverseKGroup(tail, k);
return newHead;
}
}
标签:25,head,ListNode,temp,结点,链表,tail,leetcode,翻转 来源: https://www.cnblogs.com/swifthao/p/13184993.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。