【Golang】链表翻转,Golang实现

无道 2020-12-11 0 条评论 算法分享 阅读317 手机阅读

链表翻转

链表翻转,下面是最简单的一种链表翻转

基本上有两个方法:

  • 递归版本
  • 非递归版本(多指针)
package main

import "fmt"

type Node struct {
    Element int
    Next    *Node
}

func (n *Node) Generate(num int) {
    tailNode := n
    for i := 0; i < num; i++ {
        node := &Node{Element: i + 1}
        tailNode.Next = node
        tailNode = node
    }
}

//Print 打印
func (n *Node) Print() {
    tailNode := n
    fmt.Println("======print======")
    for tailNode != nil {
        fmt.Printf("ele: %d\n", tailNode.Element)
        tailNode = tailNode.Next
    }
}

//Reverse1 双指针链表翻转
func (n *Node) Reverse1() *Node {
    cur := n
    var pre *Node

    for cur != nil {
        tmp := cur.Next
        cur.Next = pre
        pre = cur
        cur = tmp
    }
    return pre
}

//Reverse2 递归翻转
func (n *Node) Reverse2(head, pre *Node) *Node {
    if head == nil {
        return pre
    }

    res := n.Reverse2(head.Next, head)
    head.Next = pre

    return res
}

func main() {
    head := &Node{Element: 0}
    head.Generate(10)
    head.Print()
    head = head.Reverse1()
    head.Print()
    head = head.Reverse2(head, nil)
    head.Print()
}

可以看到Go是真的大道至简呀!!

指针安全,默认零值可以让你少些不少代码。

全文完 [
有帮助?打赏
支付宝打赏
微信打赏
]
标签: 算法 golang
修改: 2020-12-11 11:44
这篇文章还没有评论呢~
点击刷新/生成验证码
It's me
昵称:无道
坐标:成都
性别:
一个人,一介学生,一个儿子~ 愿你我都被世界温暖以待
迷思爱 公众号

新建了个公众号,会不定期分享一些小玩意,有提升效率的办公软件、有一些黑科技的软件、或教程等等。

爷~,要不关注下~~