将单向链表按某值划分为左边小,中间相等,右边大的形式
题目
给定一个单链表,节点值类型是整数,给定一个整数pivot。实现将链表调整为左部分都小于pivot,中间等于pivot,右边大于pivot。
例如
9->0->4->5->1 pivot=3
=>
1->0->4->9->5 or
0->1->9->5->4
链表
import random
import operator
class Node():
def __init__(self, val):
self.val = val
self.next = None
def make_linklist(datas):
head = None
tail = None
for v in datas:
node = Node(v)
if tail is None:
head = node
else:
tail.next = node
tail = node
return head
def to_list(head):
l = []
p = head
while p:
l.append(p.val)
p = p.next
return l
思路1
将链表节点存入数组,调整数组来实现,可用类似快排的方式。
def do_partition1(nodes, pivot):
small = -1
big = len(nodes)
index = 0
while index != big:
if nodes[index].val < pivot:
small += 1
nodes[small], nodes[index] = nodes[index], nodes[small]
index += 1
elif nodes[index].val > pivot:
big -= 1
nodes[big], nodes[index] = nodes[index], nodes[big]
else:
index += 1
def partition1(head, pivot):
if not head:
return head
cur = head
length = 0
while cur:
length += 1
cur = cur.next
nodes = []
cur = head
for i in range(length):
nodes.append(cur)
cur