package main

/* 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
 * }
 */
// before -> curr -> curr.Next -> after
func swapPairsOld(head *ListNode) *ListNode {
	if head == nil || head.Next == nil {
		return head
	}
	// initialize before, curr, after
	before := &ListNode{0, head}
	curr := head
	after := curr.Next.Next
	// swap node
	before.Next = curr.Next
	curr.Next.Next = curr
	curr.Next = after
	// head of result
	res := before.Next
	for after != nil && after.Next != nil {
		// move ptr
		before = curr
		curr = after
		after = after.Next.Next
		// swap node
		before.Next = curr.Next
		curr.Next.Next = curr
		curr.Next = after
	}
	return res
}

func swapPairs(head *ListNode) *ListNode {
	dummy := ListNode{0, head}
	curr := &dummy
	for curr.Next != nil && curr.Next.Next != nil {
		first, second := curr.Next, curr.Next.Next
		// swap node
		first.Next = second.Next
		second.Next = first
		curr.Next = second
		// move forward
		curr = curr.Next.Next
	}
	return dummy.Next
}

/* func main() {
	l15 := ListNode{5, nil}
	l14 := ListNode{4, &l15}
	l13 := ListNode{3, &l14}
	l12 := ListNode{2, &l13}
	l1 := &ListNode{1, &l12}
	fmt.Println(list2str(swapPairs(l1)))
	l22 := ListNode{2, nil}
	l2 := &ListNode{1, &l22}
	fmt.Println(list2str(swapPairs(l2)))
	l33 := ListNode{3, nil}
	l32 := ListNode{2, &l33}
	l3 := &ListNode{1, &l32}
	fmt.Println(list2str(swapPairs(l3)))
	fmt.Println(list2str(swapPairs(&ListNode{1, nil})))
} */