题目:K 个一组翻转链表
======================================================================================
描述:
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
进阶:
你可以设计一个只使用常数额外空间的算法来解决此问题吗?
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
解题思路:
1.在反转链表的时候可能会改变head头节点的位置,可以引用一个傀儡节点当作新头,指向链表,在返回时,返回新头的下一个节点即可.
2.在反转结束后,要链接链表前面和链表后面.所以需要一个前驱和后驱.引用一个prev指向要反转的前驱,引用一个tmp指向要反转的后驱.
3.引用一个end表示需要反转的尾节点,引用一个start表示需要反转的头节点.
4.因为如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序,所以要反转次数用循环来解决.end在循环中往后走时不为空的时候代表需要反转,当为空的时候,表示已经不需要反转了,直接break就可以了.
5.反转结束后,链接,然后进入下一次循环.直到循环中,end为空时,结束循环,表示题目已经完成.
画图解析:
代码实现:
/**
-
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 myreverse(ListNode head){
ListNode prev = null;
ListNode cur = head.next;
while(cur != null){
ListNode curNext = cur.next;
cur.next = head;
head = cur;
cur = curNext;
}
return head;
}
public ListNode reverseKGroup(ListNode head, int k) {
//引用傀儡节点newHead,prev->newHead
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
*
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!