在合并两个有序链表时让你合二为一,而这里需要分解让你把原链表一分为二。具体来说,我们可以把原链表分成两个小链表,一个链表中的元素大小都小于 x
,另一个链表中的元素都大于等于 x
,最后再把这两条链表接到一起,就得到了题目想要的结果。
class ListNode(object):
def __init__(self,val = 0,next=None):
self.val = val
self.next = next
class Linklist(object):
def __init__(self):
self.head = None
def initlist(self,data):
self.head = ListNode(data[0])
p = self.head
for i in data[1:]:
node = ListNode(i)
p.next = node
p = p.next
def partition(self,x=int):
# 存放小于x的链表的虚拟头结点
dummy1 = ListNode(-1)
# 存放大于等于x的链表虚拟头节点
dummy2 = ListNode(-1)
# p1,p2指针负责生成结果链表
p1 = dummy1
p2 = dummy2
# p负责遍历原链表,类似合并两个有序链表的逻辑
p = self.head
# 这里是将一个链表分解成两个链表
while p :
if p.val >= x :
p2.next = p
p2 = p2.next
else:
p1.next = p
p1 = p1.next
temp = p.next
p.next = None
p = temp
# 连接两个链表
p1.next = dummy2.next
return dummy1.next
def printList(self):
node = self.head
while node:
print(node.val)
node = node.next
l1 = Linklist()
l1.initlist([1,4,3,2,5,2]) # 初始化链表
l1.head = l1.partition(3)
l1.printList()
1,2,2,4,3,5
l1 = Linklist()
l1.initlist([1,4,3,2,5,2])
l1.printList()
l2 = Linklist()
l2.head = l1.partition(3)
l1.printList()
l2.printList()
1,4,3,2,5,2
1,2,2,4,3,5
1,2,2,4,3,5
注意:分区后的链表是新链表,而不是原链表。原链表的结构改变了,是因为在 partition
函数中,将原链表中的节点添加到了新的链表中,并且在添加节点后,将原链表中的节点断开,防止形成环。这就改变了原链表的结构。
在这个循环中,你首先判断当前节点 p
的值是否大于或等于 x
,然后将 p
添加到相应的链表中。然后,你将 p
的 next
指针设置为 None
,这就断开了 p
与原链表中的下一个节点的连接。最后,你将 p
设置为下一个节点,然后继续下一次循环。
这样,你就将原链表中的节点添加到了新的链表中,并且断开了原链表中的节点,这就改变了原链表的结构。
代码可视化