返回

【LeetCode】第17天 - 25. K 个一组翻转链表

发布时间:2022-12-26 16:50:26 282

25. K 个一组翻转链表

  • ​​题目描述​​
  • ​​解题思路​​
  • ​​代码实现​​

题目描述

【LeetCode】第17天 - 25. K 个一组翻转链表_链表

【LeetCode】第17天 - 25. K 个一组翻转链表_头结点_02

解题思路

  • 首先我们需要直到如何翻转一个链表
  • 然后从头结点开始遍历链表,将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) {
ListNode newHead = new ListNode(0); //新链表的头
newHead.next = head;
ListNode tempHead = newHead; // 子链表的头

ListNode tail = newHead; //子链表的尾

while(head != null){
for(int i=0;i<k;i++){
tail = tail.next; //head~tail表示一个子链表
if(tail == null){ //最后不足k个节点时直接返回
return newHead.next;
}
}
ListNode next = tail.next;
ListNode[] reverse = reverse(head, tail); //翻转子链表
head = reverse[0];
tail = reverse[1];
// 把子链表重新接回新链表
tempHead.next = head;
tail.next = next;
tempHead = tail;
head = tail.next;
}
return newHead.next;
}
//翻转head~tail的链表
public ListNode[] reverse(ListNode head, ListNode tail) {
ListNode prev = tail.next;
ListNode p = head;
while (prev != tail) {
ListNode nex = p.next;
p.next = prev;
prev = p;
p = nex;
}
return new ListNode[]{tail, head};
}
}

 

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
MVN学习笔记1 2022-12-26 16:24:30