package main

// ListNode ...
/* type ListNode struct {
	Val  int
	Next *ListNode
} */

/* func list2str(head *ListNode) string {
	curr := head
	str := make([]rune, 0)
	for curr != nil {
		str = append(str, rune(curr.Val+'0'))
		curr = curr.Next
	}
	return string(str)
} */

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
// func partition(head *ListNode, x int) *ListNode {
// 	if head == nil || head.Next == nil {
// 		return head
// 	}
// 	dummy := ListNode{0, head}
// 	fast, slow := &dummy, &dummy
// 	// slow -> body -> fast -> target -> tail
// 	// => slow -> target -> body -> fast -> tail
// 	// => slow -> body -> fast -> tail
// 	// or fast/slow -> tail
// 	for fast != nil {
// 		if fast.Next != nil && fast.Next.Val < x {
// 			if fast == slow {
// 				fast = fast.Next
// 			} else {
// 				tail := fast.Next.Next
// 				fast.Next.Next = slow.Next
// 				slow.Next = fast.Next
// 				fast.Next = tail
// 			}
// 			slow = slow.Next
// 		} else {
// 			fast = fast.Next
// 		}
// 	}
// 	return dummy.Next
// }

/* func main() {
	l15 := ListNode{5, nil}
	l14 := ListNode{0, &l15}
	l13 := ListNode{6, &l14}
	l12 := ListNode{3, &l13}
	l1 := &ListNode{7, &l12}
	fmt.Println(list2str(partition(l1, 6)))
	fmt.Println(list2str(partition(nil, 9)))
	l23 := ListNode{3, nil}
	l22 := ListNode{2, &l23}
	l2 := &ListNode{1, &l22}
	fmt.Println(list2str(partition(l2, 9)))
}
*/