这是链表的第11篇算法,力扣链接。
给你一个链表的头节点
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]
又是一个玩指针的题,这里保留一个lower指针来代表当比x小的时候移动链表的位置,这个位置要求下一个链表的值会比x大于等于。然后就去遍历就好了。
func partition(head *ListNode, x int) *ListNode {
if head == nil || head.Next == nil {
return head
}
result := &ListNode{Next: head}
lower := result
for lower.Next != nil && lower.Next.Val < x {
lower = lower.Next
}
if lower == nil {
return head
}
pre, cur := lower, lower.Next
for cur != nil {
if cur.Val < x {
pre.Next = cur.Next
lower.Next = &ListNode{Val: cur.Val, Next: lower.Next}
lower = lower.Next
cur = pre.Next
} else {
pre = pre.Next
cur = cur.Next
}
}
return result.Next
}