Golang学习之路 - LeetCode-Go-Learning 第206题. 反转链表

本文详细解析了LeetCode上206号题目——翻转链表的解题思路及Golang实现。通过两种方案展示了如何高效地反转链表结构,并提供了单元测试代码确保解决方案的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

鸣谢: LeetCode-In-Go

206. Reverse Linked List

题目

Reverse a singly linked list.

解题思路

详见注释

解题代码

方案1

package problem0206

func reverseList(head *ListNode) *ListNode {
	// prev 是所有已经逆转的节点的head
	var prev *ListNode

	// head 是下一个被逆转的节点
	for head != nil {
		// 让temp指向head.Next, 免得head.Next不见了.
		temp := head.Next
		// head称为已经逆转的节点的新head
		head.Next = prev
		// 让prev重新称为所有已被逆转节点的head
		prev = head
		// 让head指向下一个被逆转的节点
		head = temp
	}

	return prev
}

// ListNode 是链接节点
type ListNode struct {
	Val  int
	Next *ListNode
}

方案1单元测试

package problem0206

import (
	"fmt"
	"testing"

	"github.com/stretchr/testify/assert"
)

type question struct {
	para
	ans
}

// para 是参数
// one 代表第一个参数
type para struct {
	one []int
}

// ans 是答案
// one 代表第一个答案
type ans struct {
	one []int
}

func Test_Problem0206(t *testing.T) {
	ast := assert.New(t)

	qs := []question{

		question{
			para{[]int{1, 2, 3, 4, 5}},
			ans{[]int{5, 4, 3, 2, 1}},
		},

		// 如需多个测试,可以复制上方元素。
	}

	for _, q := range qs {
		a, p := q.ans, q.para
		fmt.Printf("~~%v~~\n", p)

		ast.Equal(a.one, l2s(reverseList(s2l(p.one))), "输入:%v", p)
	}
}

// convert *ListNode to []int
func l2s(head *ListNode) []int {
	res := []int{}

	for head != nil {
		res = append(res, head.Val)
		head = head.Next
	}

	return res
}

// convert []int to *ListNode
func s2l(nums []int) *ListNode {
	if len(nums) == 0 {
		return nil
	}

	res := &ListNode{
		Val: nums[0],
	}
	temp := res
	for i := 1; i < len(nums); i++ {
		temp.Next = &ListNode{
			Val: nums[i],
		}
		temp = temp.Next
	}

	return res
}

方案2

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func reverseList(head *ListNode) *ListNode {
    if head == nil || head.Next == nil {
        return head
    }
    var pre *ListNode
    cur := head
    for cur != nil {
        tmp := cur.Next
        cur.Next = pre
        pre = cur
        cur = tmp
    }
    return pre
}

总结

翻转不难,要理解pre的作用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值