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}))) } */