欢迎访问宙启技术站
智能推送

一文讲解golang怎么实现反转链表

发布时间:2023-05-14 10:48:13

反转链表是常见的链表操作之一,它可以将链表中的节点顺序颠倒过来。在golang中,实现反转链表可以通过遍历链表节点,并修改节点的指向来实现。下面我们来具体讲解如何在golang中实现反转链表。

1. 定义链表节点结构体

定义链表节点结构体,包含节点值(Value)和指向下一个节点的指针(Next)。

type ListNode struct {

    Value int       //节点值

    Next  *ListNode //指向下一个节点的指针

}

2. 定义反转链表函数

反转链表函数接受一个链表头节点作为输入参数,返回反转后的链表头节点。

func ReverseList(head *ListNode) *ListNode {

    var prev *ListNode //定义前驱节点

    for head != nil {

        next := head.Next //记录当前节点的后继节点

        head.Next = prev  //将当前节点的指针指向前驱节点

        prev = head       //更新前驱节点为当前节点

        head = next       //更新当前节点为后继节点

    }

    return prev

}

3. 测试程序

为了验证反转链表函数的正确性,我们编写测试程序,自定义一些链表,反转链表并输出结果。

func main() {

    list1 := &ListNode{Value: 1, Next: &ListNode{Value: 2, Next: &ListNode{Value: 3, Next: &ListNode{Value: 4, Next: nil}}}}

    list2 := &ListNode{Value: 5, Next: &ListNode{Value: 6, Next: nil}}

    head := ReverseList(list1)

    for head != nil {

        fmt.Printf("%d ", head.Value)

        head = head.Next

    }

    fmt.Println()

    head = ReverseList(list2)

    for head != nil {

        fmt.Printf("%d ", head.Value)

        head = head.Next

    }

}

输出结果为:

4 3 2 1

6 5

说明程序正确实现了反转链表功能。

反转链表这种操作,在实际开发中也常常遇到,比如将单向链表倒序输出、查找链表中倒数第k个节点等等。如果掌握了这种链表反转方法,对解决类似问题会有非常大的帮助。