给你一个链表的头节点 head
和一个特定值 x
,请你对链表进行分隔,使得所有 小于 x
的节点都出现在 大于或等于 x
的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。
示例1:
输入:head = [1,4,3,2,5,2], x = 3 输出:[1,2,2,4,3,5]
示例 2:
输入:head = [2,1], x = 2 输出:[1,2]
官方没有python的代码,这里参考力扣archerfrank老师的代码,出一个注释版python代码。
当个人学习记录了。
# 定义一个名为Solution的类
class Solution:
# 定义一个名为partition的方法,用于将链表按值x进行划分
# 参数head是链表的头节点,参数x是划分的阈值
# 返回值为划分后的新链表的头节点
def partition(self, head: ListNode, x: int) -> ListNode:
# 创建两个哑节点(dummy node),用于构建两个子链表(小于x的节点和大于等于x的节点)
dummy1, dummy2 = ListNode(), ListNode()
# cur1和cur2分别用于追踪两个子链表的末尾节点
# cur用于遍历原始链表
cur1,cur2, cur = dummy1, dummy2, head
# 当cur不为空时,即还有节点未处理
while cur:
# 如果当前节点的值小于x
if cur.val < x:
# 将当前节点连接到dummy1指向的子链表的末尾
cur1.next = cur
# 移动cur1到下一个位置,准备连接下一个小于x的节点
cur1 = cur1.next
else:
# 如果当前节点的值大于等于x
# 将当前节点连接到dummy2指向的子链表的末尾
cur2.next = cur
# 移动cur2到下一个位置,准备连接下一个大于等于x的节点
cur2 = cur2.next
# 移动cur到下一个节点
cur = cur.next
# 将dummy1指向的子链表的末尾指向dummy2指向的子链表的开始
# 同时将dummy2指向的子链表的末尾设置为None,避免形成环
cur1.next, cur2.next = dummy2.next, None
# 返回划分后的新链表的头节点,即dummy1指向的子链表的开始
return dummy1.next