Golang 基础
鸣谢: 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的作用。