【算法】将单链表按某值划分为左边小、中间相等、右边大的形式
2022/1/19 1:33:57
本文主要是介绍【算法】将单链表按某值划分为左边小、中间相等、右边大的形式,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
左程云算法与数据结构课 https://www.bilibili.com/video/BV13g41157hK?p=2&spm_id_from=pageDriver
题目
给定一个单链表的头节点 head,节点的值类型是整型,再给定一个整数 piovt 。实现一个调整链表的函数,将链表调整为左部分都是值小于 pivot 的节点,中间部分都是值等于 pivot 的节点,右半部分都是值大于 pivot 的节点。要求三个部分内部维持稳定性,时间复杂度为 O(N),空间复杂度为 O(1)。
题解
设 6 个指针,lH、lT、eH、eT、gH、gT 分别表示小于 pivot 部分的头指针和尾指针、等于 pivot 部分的头指针和尾指针、大于 pivot 部分的头指针和尾指针。扫描链表,根据值与 pivot 的比较结果放到三个部分之一,最后把三个部分连接起来即可。
public class ListPartition { public static Node listPartition(Node head, int pivot) { Node lH = null; //less head Node lT = null; //less tail Node eH = null; //equal head Node eT = null; //equal tail Node gH = null; //greater head Node gT = null; //greater tail Node next = null; //根据节点值分发到三个部分之一 while (head != null) { next = head.next; //保存下一个节点 head.next = null; if (head.value < pivot) { if (lH == null) { lH = head; lT = head; } else { lT.next = head; lT = head; } } else if (head.value == pivot) { if (eH == null) { eH = head; eT = head; } else { eT.next = head; eT = head; } } else { if (gH == null) { gH = head; gT = head; } else { gT.next =head; gT = head; } } head = next; } //小于部分和等于部分合并 if (lT != null) { lT.next = eH; eT = eT == null ? lT : eT; } //合并大于部分 if (eT != null) { eT.next = gH; } return lH != null ? lH : (eH != null ? eH : gH); } }
这篇关于【算法】将单链表按某值划分为左边小、中间相等、右边大的形式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南