题目: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获取)
最后
由于篇幅限制,小编在此截出几张知识讲解的图解
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
122)]
[外链图片转存中…(img-fheHefbm-1713462189124)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!