【LeetCodehot100】T24:两两交换链表中的节点 T25:K个一组翻转链表
T24:两两交换链表中的节点题目核心是两个两个一组进行交换。交换的是节点不是数字我们来举例只有两个节点的情况1-2原来1.next2;2.nextnull我们要变换为2.next1;1.nextnull;所以需要三步保存2让2指向1修改1的next当不止有一组时怎么办当1 → 2 → 3 → 4我们发现问题第一组交换后怎么连接后面的节点这时就需要用到虚拟头节点dummy交换一组节点需要几个指针以a → b为例pre → a → b → next需要四个。例如dummy → 1 → 2 → 3这里pre dummya 1b 2next 3交换操作核心原来pre → a → b → next第一步pre.nextb;第二步a.nextb.nexta后面的b已经更新到per的后面所以我们更新a.next为b的后面一位就是b.next第三步b.nexta;然后移动指针交换完一组后pre a因为a 已经在后面继续处理下一组。代码实现ListNodedummynewListNode(0);dummmy.nexthead;ListNodepredummy;while(pre.next!nullpre.next.next!null){//交换pre.nextb;a.nextb.next;b.nexta;//移动到下一组prea}returndummy.next;T25:K个一组翻转链表核心理解给你1 → 2 → 3 → 4 → 5k 2要求每 k 个节点为一组进行反转。本质高手1 找到一组 k 个节点2 把这 k 个节点反转3 接回原链表整体流程例如1 → 2 → 3 → 4 → 5k 3流程第一步 找到一组1 2 3第二步 断开链表1 → 2 → 3后面4 → 5第三步 反转3 → 2 → 1第四步 接回原链表3 → 2 → 1 → 4 → 5第五步 继续下一组4 5不够3个结束。四、为什么需要 dummy 节点很多链表题都会写ListNode dummy new ListNode(0);dummy.next head;结构变成dummy → 1 → 2 → 3 → 4 → 5作用统一处理头节点因为反转后3 会成为新头节点dummy可以帮我们管理这个变化。五、关键指针代码里会用到几个指针dummypreendstartnext作用指针作用dummy虚拟头节点pre当前组前一个节点end当前组最后一个节点start当前组第一个节点next下一组开始节点六、完整流程图原链表dummy → 1 → 2 → 3 → 4 → 5第一步 找到 k 个节点移动 end123现在pre → dummystart → 1end → 3第二步 记录下一组next 4第三步 断开链表end.next null现在链表1 → 2 → 3第四步 反转链表调用reverse(start)得到3 → 2 → 1第五步 接回链表原来dummy → 1 → 2 → 3现在dummy → 3 → 2 → 1然后1 → 4 → 5最终dummy → 3 → 2 → 1 → 4 → 5第六步 移动指针pre startend pre继续处理下一组。代码实现classSolution{publicListNodereverseKGroup(ListNodehead,intk){// 创建虚拟头节点解决头节点变化的问题// 例如反转后新的头节点可能不是原来的 headListNodedummynewListNode(0);dummy.nexthead;// pre每一组反转前的那个节点ListNodepredummy;// end用于寻找当前这一组的第 k 个节点ListNodeenddummy;while(true){// 1. 找到当前这一组的第 k 个节点// end 向前走 k 步for(inti0;ikend!null;i){endend.next;}// 如果不够 k 个节点直接结束if(endnull){break;}// 2. 记录当前这一组的开始节点// pre - start - ... - endListNodestartpre.next;// 3. 记录下一组开始的位置// end - nextListNodenextend.next;// 4. 断开当前这一组链表// 例如// 1 → 2 → 3 → 4 → 5// 变成// 1 → 2 → 3 → null 4 → 5end.nextnull;// 5. 反转当前这一组链表// reverse(start) 返回新的头节点// 例如 1→2→3 变成 3→2→1pre.nextreverse(start);// 6. 把反转后的链表接回去// start 此时已经变成这一组的最后一个节点// 让它指向下一组start.nextnext;// 7. 移动指针为下一组做准备// pre 移动到这一组的最后一个节点prestart;// end 重新回到 pre 的位置endpre;}// 返回新的头节点returndummy.next;}// 反转链表函数privateListNodereverse(ListNodehead){// pre反转后的链表头ListNodeprenull;// cur当前正在处理的节点ListNodecurhead;while(cur!null){// 保存下一个节点ListNodenextcur.next;// 反转指针// 例如2 → 1cur.nextpre;// pre 前进一步precur;// cur 前进一步curnext;}// 返回反转后的头节点returnpre;}}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2416610.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!