文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

golang单链表倒转

2023-05-15 11:03

关注

前言

在计算机科学中,链表是一种基本的数据结构,它由一系列节点组成,节点通过指针来相互链接。链表可以方便地实现插入和删除操作,但是访问操作的性能相对较差,因为需要通过遍历来查找元素。本文将介绍如何使用Golang实现单链表的倒转算法。

单链表的定义

在Golang中,我们可以使用结构体来定义单链表。定义一个结构体Node,表示单链表的节点,其中包含了该节点的值val和它指向下一个节点位置的指针next。

type Node struct {
    val  int
    next *Node
}

定义一个head指针,指向链表的头节点。如果链表为空,head指向nil。

var head *Node = nil

单链表的初始化

在Golang中,我们可以使用new函数来分配一个节点的内存,并返回该节点的指针。

func newNode(val int) *Node {
    return &Node{
        val,
        nil,
    }
}

创建一个单链表,可以通过不断的使用newNode添加节点来实现。以链表1,2,3为例,代码如下:

node1 := newNode(1)
node2 := newNode(2)
node3 := newNode(3)
  
node1.next = node2
node2.next = node3
head = node1

单链表的倒转

有两种方法可以实现单链表的倒转:迭代和递归。

方法一:迭代

迭代法的核心思想是遍历链表,并把当前节点的指针指向前一个节点,以此达到倒转的目的。

具体实现过程如下:

Golang实现代码如下:

func reverseList1(head *Node) *Node {
    var prev *Node = nil
    var next *Node = nil
  
    for head != nil {
        next = head.next
        head.next = prev
        prev = head
        head = next
    }
  
    return prev
}

方法二:递归

递归法的核心思想是先递归到链表的末尾,然后再倒序返回已经遍历的节点。

具体实现过程如下:

Golang实现代码如下:

func reverseList2(head *Node) *Node {
    if head == nil || head.next == nil {
        return head
    }
  
    newHead := reverseList2(head.next)
    head.next.next = head
    head.next = nil
  
    return newHead
}

完整的代码如下:

package main
  
import (
    "fmt"
)
  
type Node struct {
    val  int
    next *Node
}
  
func newNode(val int) *Node {
    return &Node{
        val,
        nil,
    }
}
  
var head *Node
  
func reverseList1(head *Node) *Node {
    var prev *Node = nil
    var next *Node = nil
  
    for head != nil {
        next = head.next
        head.next = prev
        prev = head
        head = next
    }
  
    return prev
}
  
func reverseList2(head *Node) *Node {
    if head == nil || head.next == nil {
        return head
    }
  
    newHead := reverseList2(head.next)
    head.next.next = head
    head.next = nil
  
    return newHead
}
  
func main() {
    node1 := newNode(1)
    node2 := newNode(2)
    node3 := newNode(3)
  
    node1.next = node2
    node2.next = node3
  
    head = node1
  
    fmt.Println("原链表:")
    for head != nil {
        fmt.Printf("%d->", head.val)
        head = head.next
    }
  
    head = node1
    head = reverseList1(head)
  
    fmt.Println("
迭代法倒转后的链表:")
    for head != nil {
        fmt.Printf("%d->", head.val)
        head = head.next
    }
  
    head = node1
    head = reverseList2(head)
  
    fmt.Println("
递归法倒转后的链表:")
    for head != nil {
        fmt.Printf("%d->", head.val)
        head = head.next
    }
}

运行结果如下:

原链表:
1->2->3->
迭代法倒转后的链表:
3->2->1->
递归法倒转后的链表:
3->2->1->

结语

本文介绍了如何使用Golang实现单链表的倒转,并介绍了两种不同的实现方法:迭代和递归。相信通过本文的学习,大家已经掌握了这两种方法的核心思想,能够灵活地应用到实际开发中。

以上就是golang单链表倒转的详细内容,更多请关注编程网其它相关文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯