最近在追数据结构与算法之美专栏,准备需要code的章节用golang实现一遍,以便学习算法的同时提升golang的姿势水平。

  • golang版本链表逆置
    package main

    import (
    "fmt"
    )

    type Node struct {
    data int
    next *Node
    }

    func (r *Node) addNode(i int) {
    node := Node{
    data: i,
    next: nil,
    }
    node.next = r.next
    r.next = &node
    }

    func (n *Node) reverseNodes() {
    p := n.next
    if p != nil {
    q := p.next
    p.next = nil
    for; q != nil; {
    r := q.next
    q.next = p
    p = q
    q = r
    }
    n.next = p
    }
    }

    func (r *Node) print() {
    for r.next != nil {
    r = r.next
    fmt.Printf("%d ", r.data)
    }
    fmt.Println()
    }

    func (r *Node) findMiddleNode() {
    if r.next != nil {
    p := r.next
    if p != nil {
    q := p.next
    for {
    if q != nil && q.next != nil {
    q = q.next.next
    p = p.next
    } else {
    break
    }
    }
    fmt.Println(p.data)
    }
    }
    }

    func main() {
    rootNode := Node{
    data: -1,
    next: nil,
    }
    root := &rootNode
    root.addNode(1)
    root.addNode(2)
    root.addNode(3)
    root.addNode(4)
    root.addNode(5)
    root.addNode(6)
    root.reverseNodes()
    root.print()
    root.findMiddleNode()
    }