12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- package main
- import "fmt"
- 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})))
- }
|