RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1439683
Accepted
Сергей
Сергей
Asked:2022-08-16 07:15:38 +0000 UTC2022-08-16 07:15:38 +0000 UTC 2022-08-16 07:15:38 +0000 UTC

Go:将指针传递给方法并更改它们

  • 772

我开始学习围棋,但我无法弄清楚该主题的某些内容。这是链接列表

    type List struct {
        next *List
        val  any
}

我创建一个这样的实例

myList := &List{nil, 1}

我添加更多链接并尝试像这样部署它

func (n *List) Reverse() {
    var tmp *List
    tmp = n
    var prev *List
    var last *List
    for tmp != nil {
        last = tmp.next
        tmp.next = prev
        prev = tmp
        tmp = last
    }
    *n = *prev
}

传播本身是标准的,取自另一种有效的语言。但是这里的列表奇怪地循环了。我究竟做错了什么?这个列表1 2 3 4 变成4 3 2 4 3 2 4 3 2 4 3 2 4 3 2 4 3 2 4

这是代码的链接https://go.dev/play/p/VLffKqlex-d

golang указатели
  • 2 2 个回答
  • 68 Views

2 个回答

  • Voted
  1. Best Answer
    Pak Uula
    2022-08-17T12:06:39Z2022-08-17T12:06:39Z

    当您在表达式中获取列表的第一个元素时tmp = n,您正在写入tmp指向与它指向的相同内存位置的指针n。

    因此,当您访问第二个元素时,它的指针.next指向n

    当你在循环之后执行时*n = *prev,会发生这种情况: 和 字段的值在地址处发生了变化,n但值本身并没有改变。这意味着反向列表的最后一个元素将指向列表的头部。结果是一个循环。n->nextn->valn

    为了不发生循环,当最后一个元素被访问时,它必须在一个新的位置。而是tmp = n写tmp = &List{n.next, n.val}

    实际上,您的Push工作正是因为您last := *n通过分配在堆上的新位置创建了列表头部的副本。结果,在赋值之后*n = *node,单元格n.next包含一个指向新分配的指针last

    工作代码示例https://go.dev/play/p/LiWA4NfpV82

    添加剂

    如何在不创建新节点的情况下反转列表。n您需要交换这些对的内容,而不是仅仅复制反向列表头部的内容。并更新倒数第二个元素中的指针:

    type List struct {
        next *List
        val  interface{}
    }
    
    func (l *List) ReverseInPlace() {
        if l == nil {
            // empty list
            return
        }
        var head, tail *List
        var second_last *List
        tail = l
        for tail != nil {
            next_tail := tail.next
            tail.next = head
            head = tail
            tail = next_tail
    
            if head.next == l {
                second_last = head
            }
        }
        // Swap l.val and head.val
        if l == head {
            // single-element list
            // do nothing
        } else {
            *l, *head = *head, *l
            // Update last-but-one element
            if second_last == head {
                // two element list
                l.next = head
            } else {
                // more than 2 elements in the list
                second_last.next = head
            }
        }
    }
    

    完整代码https://go.dev/play/p/GCNLeGWxezi 警告:此示例不检查列表中的循环。

    • 1
  2. Антон
    2022-08-17T00:23:32Z2022-08-17T00:23:32Z

    是的,它真的不会那样工作。好吧,至少它对我也不起作用。我认为不能直接更改接收方地址,也不能这样做:

    func (l **List) Reverse()
    

    但你可以这样做:

    func Reverse(list **List) {
        node := *list
        var prev *List
    
        for node != nil {
            node, prev, node.next = node.next, node, prev
        }
        *list = prev
    }
    

    这看起来并不漂亮,而且可能是惯用的错误。然后,您可以将指向列表头部的指针存储在单独的结构变量中,如本例中所做的那样: https ://gist.github.com/PARUS/55ee88bfecb87f8614e1a4f67b57c866

    • 0

相关问题

  • windows上的protoc编译错误

  • 递归打印包依赖

  • Golang 算法 XTEA ECB 库“golang.org/x/crypto/xtea”

  • 如何将 IMEI 转换为字节并返回 golang

  • 如何创建文件并将其移动到新目录?

  • go中的函数参数中是否有cv-qualifier的类似物?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5