使用Golang实现反转链表,可以通过递归和迭代两种方式来实现。

1. 递归的实现方法:

首先,我们需要定义一个Node结构体,用于表示链表的节点:

type Node struct {
    Val  int
    Next *Node
}

然后,定义一个reverse函数,用于反转链表:

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

该函数的作用是反转以head为头结点的链表,并返回新的头结点newHead。如果head为nil或head.Next为nil,直接返回head。否则,先递归反转head.Next及其后面的节点,再将head接到newHead的末尾,最后将head.Next置为nil。这样,就完成了整个链表的反转。

完整示例代码如下:

package main

import "fmt"
type Node struct {
    Val  int
    Next *Node
}func reverse(head *Node) *Node {
    if head == nil || head.Next == nil {
        return head
    }
    newHead := reverse(head.Next)
    head.Next.Next = head
    head.Next = nil
    return newHead
}
func main() {
    head := &Node{1, &Node{2, &Node{3, &Node{4, &Node{5, nil}}}}}
    newHead := reverse(head)
    for newHead != nil {
        fmt.Printf("%d ", newHead.Val)
        newHead = newHead.Next
    }
}

输出结果为:

5 4 3 2 1

2. 迭代的实现方法:

也可以使用迭代的方法来反转链表。代码如下:

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

该函数的作用是通过遍历链表,依次将每个节点的Next指针指向前一个节点,最终返回新的头结点prev。初始时,将prev和next设为nil,然后依次遍历每个节点,将其Next指针指向prev,并将prev设为当前节点,head设为next。

完整示例代码如下:

package main

import "fmt"
type Node struct {
    Val  int
    Next *Node
}func reverse(head *Node) *Node {
    var prev, next *Node
    for head != nil {
        next = head.Next
        head.Next = prev
        prev = head
        head = next
    }
    return prev
}
func main() {
    head := &Node{1, &Node{2, &Node{3, &Node{4, &Node{5, nil}}}}}
    newHead := reverse(head)
    for newHead != nil {
        fmt.Printf("%d ", newHead.Val)
        newHead = newHead.Next
    }
}

输出结果为:

5 4 3 2 1