登录
首页 >  Golang >  Go问答

在Golang中实现在双链接循环列表中插入元素的函数InsertBefore()

来源:stackoverflow

时间:2024-02-13 12:27:19 116浏览 收藏

积累知识,胜过积蓄金银!毕竟在Golang开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《在Golang中实现在双链接循环列表中插入元素的函数InsertBefore()》,就带大家讲解一下知识点,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

我在 golang 中实现一个双链循环列表,遇到以下问题,我能够正确组装 insertafter() 函数以将值添加到列表中,它包含以下结构:

package main

type node struct {
    value int
    next  *node
    prev  *node
}

func createlist(n int) *node {
    nn := &node{
        value: n,
        next:  nil,
        prev:  nil,
    }
    nn.next = nn
    nn.prev = nn

    return nn
}

func insertafter(p *node, value int) *node {
    nn := &node{value: value}
    q := p.next
    p.next = nn
    nn.next = q
    q.prev = nn
    nn.prev = p

    return nn
}

func main() {
    l := createlist(3)
    x := insertafter(l, 7)
    insertafter(x, 11)
    k := insertbefore(x, 5) //this (when it works) should insert the value 5 before the value 7
}

在此之后,我使用此函数在列表中插入 3 个 int 值(值 3、7 和 11),但我需要创建一个函数(称为 insertbefore()),尊重前一个函数的结构并满足与此相反的函数并之前插入一个值,我能够创建其中的一部分,但它不起作用(如下所示),您能告诉我我在哪里失败了或者我缺少什么来完成它吗?谢谢。

func InsertBefore(p *Node, value int) *Node {

    nn := &Node{Value: value}
    q := p.Prev
    p.Prev = nn
    nn.Prev = q
    q.Next = nn
    nn.Next = p

    return nn
}

正确答案


我为代码添加了一些解决方法。我认为这现在有效。

package main
    
    import (
        "fmt"
    )
    
    type Node struct {
        Value int
        Next *Node
        Prev *Node
    }
    
    func CreateList(n int) *Node {
        nn := &Node{
            Value: n,
            Next: nil,
            Prev: nil,
        }
        nn.Next = nn
        nn.Prev = nn
    
        return nn
    }
    
    
    func (p *Node)InsertAfter(value int) *Node {
        nn := &Node{Value: value}
        nn.Prev = p
        nn.Next = p.Next
    
        //if p is not the last element in the list
        //its next.previous should be new node
        if p.Next.Prev != p.Next {
            p.Next.Prev = nn
        }
    
        p.Next = nn
    
        return nn
    }
    
    func printList(p *Node) {
        n := p
        for {
            fmt.Println(fmt.Sprintf(`node %v, prev %v, next %v`, n, n.Prev.Value, n.Next.Value))
            n = n.Next
            if n == p {
                break
            }
        }
    }
    
    func (p *Node)InsertBefore(value int) *Node {
        nn := &Node{Value: value}
        nn.Next = p
        nn.Prev = p.Prev
        if p.Prev == p {
            //this means this is the root
            //so we need to update last node's next
            n := p
            for {
                if n.Next == p {
                    n.Next = nn
                    break
                }
                n = n.Next
            }
            nn.Prev = nn
        } else {
            p.Prev.Next = nn
        }
        p.Prev = nn
        return nn
    
    }
    
    func main() {
        L := CreateList(3)
        x := L.InsertBefore(7)
    
        x.InsertAfter(11)
        x.InsertBefore(5)
    
        fmt.Println(`final list`)
        printList(x)
    }

//Output: -
//final list
//node &{7 0xc00000c060 0xc00000c078}, prev 5, next 11
//node &{11 0xc00000c030 0xc00000c048}, prev 7, next 3
//node &{3 0xc00000c078 0xc00000c060}, prev 11, next 5
//node &{5 0xc00000c048 0xc00000c078}, prev 5, next 7

您可以运行代码here

终于介绍完啦!小伙伴们,这篇关于《在Golang中实现在双链接循环列表中插入元素的函数InsertBefore()》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>