首页 > 其他分享 >golang 数组转为链表 - 正序和逆序

golang 数组转为链表 - 正序和逆序

时间:2024-07-27 19:50:51浏览次数:14  
标签:node golang head 正序 nums int 链表 listNode

有时候,有这样的场景,我们需要就给定数组将其转为一个链表,通常的思路有两种:

  • 正序
  • 逆序

以下是具体的代码实现和测试函数:

package main

import (
   "fmt"
   "testing"
)

type listNode struct {
   next *listNode
   val  int
}

// 正序遍历构建链表
// 通过一个虚拟头结点,不断向后遍历
func array2ListNode(nums []int) *listNode {
   if len(nums) <= 0 {
      return nil
   }

   var dummy = &listNode{val: 0}
   var cur = dummy
   for i := 0; i < len(nums); i++ {
      node := &listNode{val: nums[i]}
      cur.next = node
      cur = cur.next
   }

   return dummy.next
}

// 逆序构建链表
// 每次逆序遍历时,新节点 -> head,head = newNode,以完成相关指向
func array2ListNodeInRev(nums []int) *listNode {
   if len(nums) <= 0 {
      return nil
   }

   var head *listNode
   for i := len(nums) - 1; i >= 0; i-- {
      node := &listNode{val: nums[i]}
      node.next = head
      head = node
   }

   return head
}

func TestArray2ListNode(t *testing.T) {
   nums := []int{1, 2, 3, 4}
   head := array2ListNode(nums)
   for head != nil {
      fmt.Printf("node: %d\n", head.val)
      head = head.next
   }
}

func TestArray2ListNodeInRev(t *testing.T) {
   nums := []int{1, 2, 3, 4}
   head := array2ListNodeInRev(nums)
   for head != nil {
      fmt.Printf("node: %d\n", head.val)
      head = head.next
   }
}

标签:node,golang,head,正序,nums,int,链表,listNode
From: https://www.cnblogs.com/davis12/p/18327392

相关文章

  • Golang 高性能 Websocket 库 gws 使用与设计(一)
    前言大家好这里是,白泽,这期分析一下golang开源高性能websocket库gws。视频讲解请关注......
  • 手撕数据结构---------顺序表和链表
    1.线性表线性表(linearlist)是n个具有相同特性的数据元素的有限序列。线性表是⼀种在实际中⼴泛使⽤的数据结构,常⻅的线性表:顺序表、链表、栈、队列、字符串…线性表在逻辑上是线性结构,也就说是连续的⼀条直线。但是在物理结构上并不⼀定是连续的,线性表在物理上存储时,通常......
  • 【数据结构】:用Java实现链表
    在ArrayList任意位置插入或者删除元素时,就需要将后序元素整体往前或者往后搬移,时间复杂度为O(n),效率比较低,因此ArrayList不适合做任意位置插入和删除比较多的场景。因此:java集合中又引入了LinkedList,即链表结构。概念顺序表是物理上连续,逻辑上也是连续的链表......
  • 【LeetCode】141.环形链表、142. 环形链表 II(算法 + 图解)
    Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎~~......
  • SQL数据库表 多对多关系设计--省去链表的尝试
     概述 之前遇到一个MES需求,需要创建一个基础资料表"人员信息表",用于其它业务的人员信息关连,因为这些人员并非系统登录帐号,所以单独进行维护。人员表涉及到字段包括:ID,工号,姓名,所属工序,所属职称,所属车间。其中,所属工序、所属职称、所属车间为多选。例:一位人员,比如"班长......
  • 删除链表倒数第N个节点(19)
    双指针法双指针法主要是最开始有两个指针fast,slow都指向链表的虚拟头节点dummy,然后快指针先移动,这里需要先向后移动n+1位(因为你最终是要找到目标节点的前一个节点),然后slow和fast节点就开始同时移动,直至fast指向链表的最后一个节点的下一个指向null,此时slow节点就指向了链表目......
  • Linux内核链表源码的简单操作
    一、Linux内核链表源码的获取下载系统源码的方法常见的有两种:第一种访问网站下载:kernel.org第二种输入Linux命令下载:sudoaptinstalllinux-source-5.15.0(一般这种下载的是当前系统所用到的系统源码版本)下载完之后在/usr/src中可找到系统源码的压缩包,可以解压......
  • 反转链表(206)
    双指针法一个节点为cur最开始的时候指向head,pre最开始的时候指向null,然后cur,pre节点一次向后移动进行遍历操作,直至cur指向null,链表遍历结束,最后返回pre节点就是反转链表后的一个头节点classSolution{publicListNodereverseList(ListNodehead){ListNodepr......
  • 两两交换链表中的节点(24)
    两两交换,我们定义一个虚拟头节点指向我们链表的头节点,然后我们就可以将链表的第一个节点的下一个节点指向为第二个节点的下一个节点,然后第二个节点的下一个节点指向第一个节点,然后虚拟头节点指向我们的第二个节点就完成了前两个节点的交换classSolution{publicListNodes......
  • 移除链表元素
    这里注意我们操作链表的时候都要使用临时指针来进行遍历链表的操作,不然会改变链表的原始数据,这里我使用两种方式来进行删除的操作原链表删除元素classSolution{publicListNoderemoveElements(ListNodehead,intval){//if(head==null){//ret......