|
@@ -0,0 +1,85 @@
|
|
|
|
+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})))
|
|
|
|
+}
|