-
题目:
- 给定一个单向链表,如 LinkedList [21, 5, 120, 19, 72, 50, 312]。
再给定任意一个数值,比如50,返回一个链表,保证左边小、中间相等、右边大的形式,比如该例子的返回链表结果为:[21, 5, 19, 50, 120, 72, 312] -
再比如给定值100,返回的链表结果为:[21, 5, 19, 72, 50, 120, 312]
且需要保证修改后的链表中,不论是左、中、右哪一部分结点的先后顺序和原链表中一致。
要求:时间复杂度为O(n),空间复杂度为O(1)。
代码:
def list_partition(head, pivot):
'''
将单向链表按某个值划分成左边小,中间相等,右边大的形式
:param head:单向普通链表的头结点
:param pivot:中间相等的那个数值
:return:返回新的单向链表,左边和右边的结点顺序和原链表中的顺序一致。
方法1:最常见的算法就是重新开辟三个链表,分别存储small ,middle,和large的值,时间复杂度为链表长度,空间复杂度也是
方法2:把空间复杂度降到o(1),就是需要不停地调整链表中的位置
'''
if head == 0:
print "This is an empty linked list."
return
sh, st, eh, et, lh, lt = 0, 0, 0, 0, 0, 0
p = head
while p != 0:
if p.value < pivot:
if sh == 0:
sh = p
st = p
else:
st.next = p
st = st.next
elif p.value == pivot:
if eh == 0:
eh = p
et = p
else:
et.next = p
et = et.next
else:
if lh == 0:
lh = p
lt = p
else:
lt.next = p
lt = lt.next
p = p.next
if sh != 0 and eh != 0 and lh != 0:
head = sh
st.next = eh
et.next = lh
lt.next = 0
elif sh == 0 and eh != 0 and lh != 0:
head = eh
et.next = lh
lh.next = 0
elif sh == 0 and eh == 0 and lh != 0:
head = lh
lh.next = 0
elif sh == 0 and eh != 0 and lh == 0:
head = eh
et.next = 0
elif sh != 0 and eh == 0 and lh == 0:
head = sh
st.next = 0
elif sh != 0 and eh != 0 and lh == 0:
head = sh
st.next = eh
et.next = 0
elif sh != 0 and eh == 0 and lh != 0:
head = sh
st.next = lh
lt.next = 0
return head
-
分析:
- 1、其实也没什么难度,主要就是操作一些结点指针变量来控制链表结点的指针域。分别存入三个链表,small,equal,large中,三个链表分别标注头尾两个指针。
2、并且要分情况讨论如果链表为空的情况。由于Python 里面没有 if else 语句的简写语法,所以必须一点点的把控制逻辑写出来。