/* 初始化数组 */ var arr [5]int // 在 Go 中,指定长度时([5]int)为数组,不指定长度时([]int)为切片 // 由于 Go 的数组被设计为在编译期确定长度,因此只能使用常量来指定长度 // 为了方便实现扩容 extend() 方法,以下将切片(Slice)看作数组(Array) nums := []int{1, 3, 2, 5, 4}
访问元素
数组元素基于连续地址
得出:元素内存地址=数组内存地址(首元素地址)+元素长度×元素索引(内存地址偏移量)
插入元素
中间插入一个元素时,该元素的所有元素往后移动一位
/* 在数组的索引 index 处插入元素 num */ funcinsert(nums []int, num int, index int) { // 把索引 index 以及之后的所有元素向后移动一位 for i := len(nums) - 1; i > index; i-- { nums[i] = nums[i-1] } // 将 num 赋给 index 处的元素 nums[index] = num }
删除元素
中间删除一个元素时,该元素的所有元素往前移动一位
/* 删除索引 index 处的元素 */ funcremove(nums []int, index int) { // 把索引 index 之后的所有元素向前移动一位 for i := index; i < len(nums)-1; i++ { nums[i] = nums[i+1] } }
遍历数组
/* 遍历数组 */ functraverse(nums []int) { count := 0 // 通过索引遍历数组 for i := 0; i < len(nums); i++ { count += nums[i] } count = 0 // 直接遍历数组元素 for _, num := range nums { count += num } // 同时遍历数据索引和元素 for i, num := range nums { count += nums[i] count += num } }
查找元素
/* 在数组中查找指定元素 */ funcfind(nums []int, target int) (index int) { index = -1 for i := 0; i < len(nums); i++ { if nums[i] == target { index = i break } } return }
扩容数组
/* 扩展数组长度 */ funcextend(nums []int, enlarge int) []int { // 初始化一个扩展长度后的数组 res := make([]int, len(nums)+enlarge) // 将原数组中的所有元素复制到新数组 for i, num := range nums { res[i] = num } // 返回扩展后的新数组 return res }
/* 在链表的节点 n0 之后插入节点 P */ funcinsertNode(n0 *ListNode, P *ListNode) { n1 := n0.Next P.Next = n1 n0.Next = P }
// 删除链表中特定值的节点 funcdeleteNodeWithValue(head *ListNode, val int) *ListNode { // 如果要删除的节点是头节点 if head.Val == val { return head.Next } current := head for head.Next != nil { if current.Next.Val == val { current.Next = current.Next.Next break } current = current.Next } return head }
/* 访问链表中索引为 index 的节点 */ funcaccess(head *ListNode, index int) *ListNode { for i := 0; i < index; i++ { if head == nil { returnnil } head = head.Next } return head }
/* 查找某索引的节点 */ funcsearchNode(head *ListNode, target int)int { index := 0 for head != nil { if head.Val == target { return index } head = head.Next index++ } return-1 }