当前位置: 首页 > 科技观察

图:K翻转链表-LeetCode级别:难

时间:2023-03-15 19:14:11 科技观察

1.顺序链表作为一种基本的数据结构,理解起来非常简单。它通过指针将一组分散的内存空间(节点)串联起来,形成一个数据结构。在面试的算法题中,经常会遇到链表相关的面试题。虽然链表的结构比较容易理解,但是链表的题还是比较考验代码能力的。有些单链表题,指针来回指向,很容易丢失结点的next指针,造成链表断链。链表翻转是面试中经常遇到的一个问题。上一篇还讲了单链表翻转和链表双翻转(点击蓝字跳转了解),今天就来说说它们的“升级版”。在一组K中,翻转链表,这也是LeetCode第25题。2.一组K个翻转链表以K个节点为一组翻转给定的单链表。和之前的链表成对翻转有点类似,只不过此时K=2。本题中K变成外部正整数,为变量值,小于等于链表长度。这个算法题会用到之前的知识。由于K是可变的,我们无法估计K的大小,但是我们可以使用原始链表以K个节点为一组来执行翻转单链表的逻辑。这就要用到《单链表翻转》之前的技能了。如果不明白,建议先阅读上一篇。由于原来的链表需要先按K个节点分组,然后依次翻转单链表,翻转完每组单词链表后,需要重新串起来,否则链表会断掉。这就需要使用prev和end两个变量分别记录子表的前驱节点和子表的结束节点。有了子链表的尾节点end,通过end.next很容易得到下一个子链表的头节点。根据这些节点可以完成子链表的翻转,并保证翻转后子链表仍然可以连接。此外,还有一项特殊待遇。当原链表按K个节点分组后,末尾未满一组的子链表将保持原样,不翻转。参考成对翻转链表的思想,为了保证我们代码逻辑的统一性,我们添加了一个dummy头节点dummy,方便我们写代码。直接上代码,详情在评论里。classSolution{publicListNodereverseKGroup(ListNodehead,intk){//添加虚拟头节点ListNodedummy=newListNode(0);dummy.next=头;//定义上一个和结束节点ListNodeprev=dummy;ListNode结束=虚拟;while(end.next!=null){//以k个节点为条件,分组子列表for(inti=0;i