halfrost / S2

S2 geometry library in Go | experiment version
Apache License 2.0
21 stars 5 forks source link

0024. Swap Nodes in Pairs | LeetCode Cookbook #124

Open halfrost opened 4 years ago

halfrost commented 4 years ago

https://books.halfrost.com/leetcode/ChapterFour/0001~0099/0024.Swap-Nodes-in-Pairs/

OpensourceHU commented 4 years ago

我放一个 递归的写法吧

    public ListNode swapPairs(ListNode head) {
//如果为空或为单数节点  中basecase 直接返回
        if(head==null||head.next==null)
            return head;
//记录第一二个节点 对第三个节点开头的子链递归 记录其返回头为newHead
        ListNode first = head;
        ListNode second = head.next;
        ListNode newHead = swapPairs(second.next);
//将第一二个节点排序完成  将排好序的子链拼接上去 返回新的头
        second.next = first;
        first.next = newHead;
        return second;
    }
halfrost commented 4 years ago

我放一个 递归的写法吧

    public ListNode swapPairs(ListNode head) {
//如果为空或为单数节点  中basecase 直接返回
        if(head==null||head.next==null)
            return head;
//记录第一二个节点 对第三个节点开头的子链递归 记录其返回头为newHead
        ListNode first = head;
        ListNode second = head.next;
        ListNode newHead = swapPairs(second.next);
//将第一二个节点排序完成  将排好序的子链拼接上去 返回新的头
        second.next = first;
        first.next = newHead;
        return second;
    }

👍🏻

hanlins commented 3 years ago

放一个one-liner吧,其实可以充分利用golang的特性来做这道题

func swapPairs(head *ListNode) *ListNode {
    dummy := &ListNode{Next: head}
    for pt := dummy; pt != nil && pt.Next != nil && pt.Next.Next != nil; {
        pt, pt.Next, pt.Next.Next, pt.Next.Next.Next = pt.Next, pt.Next.Next, pt.Next.Next.Next, pt.Next
    }
    return dummy.Next
}
halfrost commented 3 years ago
func swapPairs(head *ListNode) *ListNode {
    dummy := &ListNode{Next: head}
    for pt := dummy; pt != nil && pt.Next != nil && pt.Next.Next != nil; {
        pt, pt.Next, pt.Next.Next, pt.Next.Next.Next = pt.Next, pt.Next.Next, pt.Next.Next.Next, pt.Next
    }
    return dummy.Next
}

@hanlins 你这个解法写的很巧妙啊!!学习了!!

duhd1993 commented 3 years ago

算法我明白,每三个一组置换。但不是太懂GO,这样的写法不就成了个环了吗? 好像有点明白了,我用python写的,python这种写法,右边是一次性eval了,但是左边还是一个个来的。Go大概是左边的指针也一次性eval后再赋值。用python写这个解法太绕了,本来就没有显式的指针。

halfrost commented 3 years ago

@duhd1993 嗯,这个算是 Go 的语法特性。如果等号两边有多个变量赋值,会按照顺序依次赋值。所以不会出现你说的形成环了。

hujun2020 commented 3 years ago

绕的连妈都不认识了。

halfrost commented 3 years ago

@hujun2020 具体代码哪里绕呢?我来解释解释

hujun2020 commented 3 years ago

怎么现在评论还限制了?擦   Error: API rate limit exceeded for app ID 75d9d747f200c623a0e6..

------------------ 原始邮件 ------------------ 发件人: @.>; 发送时间: 2021年8月5日(星期四) 晚上7:35 收件人: @.>; 抄送: @.>; @.>; 主题: Re: [halfrost/S2] 0024. Swap Nodes in Pairs | LeetCode Cookbook (#124)

@hujun2020 具体代码哪里绕呢?我来解释解释

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or unsubscribe. Triage notifications on the go with GitHub Mobile for iOS or Android.

halfrost commented 3 years ago

怎么现在评论还限制了?擦   Error: API rate limit exceeded for app ID 75d9d747f200c623a0e6..

@hujun2020 我也发现了这个错误。我晚点查查,这个错误到底是什么 limit。我这边没有发版,什么都没有操作。