链表问题---将单向链表按某值划分成左边小,中间相等,右边大的形式
来源:互联网 发布:淘宝双11发货时间规定 编辑:程序博客网 时间:2024/04/25 15:32
【题目】
给定一个单向链表的头节点head,节点的值类型是整型,再给定一个整数pivot。实现一个调整链表的函数,将链表调整为左部分都是值小于pivot的节点,中间部分都是值等于pivot的节点,右部分都是值大于pivot的节点。除这个要求外,对调整后的节点顺序没有更多的要求。
【进阶题目】
在原问题的要求之上再增加如下两个要求:
- 在左、中、右三个部分的内部也做顺序要求,要求每部分里的节点从左到右的顺序与原链表中节点的先后次序一致。
- 如果链表长度为N,要求时间复杂度O(N),空间复杂度O(1)。
【基本思路】
原问题。将所有的节点放置到一个数组中,对这个数组进行partition调整(快排调整过程),再将每个数组中每个节点串起来即可。
#python3.5def listPartition(head, pivot): def partition(nodeArr, pivot): left = -1 right = len(nodeArr) index = 0 while index < right: if nodeArr[index].val < pivot: left += 1 nodeArr[left], nodeArr[index] = nodeArr[index], nodeArr[left] index += 1 elif nodeArr[index].val == pivot: index += 1 else: right -= 1 nodeArr[index], nodeArr[right] = nodeArr[right], nodeArr[index] if head == None or head.next == None: return head cur = head n = 0 while cur != None: n += 1 cur = cur.next nodeArr = [] cur = head while cur != None: nodeArr.append(cur) cur = cur.next partition(nodeArr, pivot) for i in range(n-1): nodeArr[i].next = nodeArr[i+1] nodeArr[-1].next = None return nodeArr[0]
进阶题目。按照原链表各个节点的对应顺序将链表分解成三部分,小于pivot的、等于pivot的,大于pivot的,之后再将三个连起来即可。
def listPartition2(head, pivot): if head == None or head.next == None: return head sH = None #small部分的头 sT = None #small部分的尾 eH = None #equal部分的头 eT = None #equal部分的尾 bH = None #big部分的头 bT = None #big部分的尾 while head != None: next = head.next head.next = None if head.val < pivot: if sH == None: sH = head sT = head else: sT.next = head sT = head elif head.val == pivot: if eH == None: eH = head eT = head else: eT.next = head eT = head else: if bH == None: bH = head bT = head else: bT.next = head bT = head head = next head = None if sT != None: head = sH if eH != None: sT.next = eH elif bH != None: sT.next = bH if eT != None: head = head if head != None else eH if bH != None: eT.next = bH return head
阅读全文
2 0
- 链表问题---将单向链表按某值划分成左边小,中间相等,右边大的形式
- 将单向链表按某值划分成左边小、中间相等、右边大的形式
- Java——将单向链表按某值划分成左边小、中间相等、右边大的形式(基础问题)
- Java——将单向链表按某值划分成左边小、中间相等、右边大的形式(进阶问题)
- 将单向链表按某值划分成左边小,中间相等,右边大
- 将单向链表按某个值划分成左边小、中间相等、右边大的形式 Python 版
- 把单链表按某值划分成左边小,中间相等,右边大的形式,时间O(n),空间O(1)
- [JS]链表划分给定中间值,小的在左边,大的在右边并保持原排序
- C++将链表划分为左边小,中间等,右边大于pivotKey的形式
- C++链表划分左边小中间等右边大 时间复杂度O(n) 空间复杂度O(1)
- 编写一个算法将顺序表A分成两部分,大于0 的在A的左边,小于0的在A的右边
- 在数组中 找左边都比其小右边都比其大的元素
- 每日一题(61) - 找出左边比它小,右边比它大的数
- 仅用O(1)的空间,将整数数组按奇偶数分成2部分,数组左边是奇数、右边是偶数
- 查找单向链表的中间元素
- 中间带环的单向循环链表
- 将硬币分成正面朝上个数相等的两堆
- 将一个数组分成和尽可能相等的两份
- ssh免密登录
- 理解红黑树(下)删除操作
- LIUNX 使用过程中的一些需要了解的知识点
- 一个超级快速的开平方根C函数
- composer
- 链表问题---将单向链表按某值划分成左边小,中间相等,右边大的形式
- 多线程下载+存放SD卡
- ImageLoader设置图片配置
- starUML2.8.0(macOS)注册激活
- HTML页面侧栏动态效果
- python全局变量-局部变量区别及用法
- Linux下的tar压缩解压缩命令详解
- c++随机数
- Git之(五)远程管理