反转链表golang

发布时间:2024-12-22 23:58:57

反转链表

链表是一种常见的数据结构,由一个个节点组成,每个节点包含一个值和一个指向下一个节点的指针。我们可以通过指针将多个节点串联起来,形成一个链表。

在实际开发中,经常会遇到需要反转链表的需求。反转链表是将链表中的节点顺序逆转,即原链表的头节点变为尾节点,原链表的尾节点变为头节点。这样做的好处是可以更方便地对链表进行操作和遍历。

下面是一种简单而有效的反转链表的实现方法:

算法思路:

我们可以定义三个指针:pre指向当前节点的前一个节点,cur指向当前节点,next指向当前节点的下一个节点。然后不断地将cur的指针指向pre,然后将pre、cur、next都向后移动一个节点,直到遍历完整个链表。最后将链表的头结点指向pre节点,即可完成链表的反转。

代码实现:

``` type ListNode struct { Val int Next *ListNode } func reverseList(head *ListNode) *ListNode { var pre *ListNode cur := head for cur != nil { next := cur.Next cur.Next = pre pre = cur cur = next } return pre } ```

代码解析:

我们定义了一个ListNode结构体,表示链表的每个节点。其中Val字段存储节点的值,Next字段指向下一个节点。

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

我们首先定义了三个指针:pre、cur、next。初始时,pre为nil,cur指向头节点。

然后我们通过循环遍历链表,直到cur为nil。在循环中,我们首先将next指针指向cur的下一个节点,以保存下一次遍历的信息。

然后将cur的Next指针指向pre,相当于将cur节点的Next指针反转了。

接着,我们将pre指针指向cur,cur指针指向下一个节点(即next),进入下一轮循环。

最后,当cur为nil时,说明遍历结束,此时pre指向反转后的链表的头节点,我们将其返回即可。

测试示例:

``` func main() { // 构造一个链表,节点值依次为1,2,3,4,5 head := &ListNode{Val: 1} node2 := &ListNode{Val: 2} node3 := &ListNode{Val: 3} node4 := &ListNode{Val: 4} node5 := &ListNode{Val: 5} head.Next = node2 node2.Next = node3 node3.Next = node4 node4.Next = node5 // 反转链表 reversedHead := reverseList(head) // 输出反转后的链表 for reversedHead != nil { fmt.Print(reversedHead.Val, " ") reversedHead = reversedHead.Next } fmt.Println() } ``` 输出结果为:5 4 3 2 1。可以看出,链表已经成功反转。

总结:

反转链表是一种常见的链表操作,可以帮助我们更方便地对链表进行操作和遍历。通过定义三个指针,我们可以在遍历链表的过程中实现链表的反转。这种方法时间复杂度为O(n),其中n是链表的长度。

以上就是使用golang实现反转链表的方法和代码。希望能对你理解链表的操作和算法有所帮助。

相关推荐