`
happy_zhourong
  • 浏览: 13304 次
  • 性别: Icon_minigender_2
文章分类
社区版块
存档分类
最新评论

链表与数组之间的相互转换

    博客分类:
  • java
 
阅读更多

数组是一种连续的数据结构,而链表是一种离散的数据结构,链表与数组如何转换呢?

1、  数组转换成链表:

root=new LinkNode(s[0]);//生成链表的根节点,并将数组的第一个元素的值赋给链表的根节点
LinkNode other=root;//生成另一个节点,并让other指向root节点,other在此作为一个临时变量,other和root指向同一地址 
                   for(int i=1;i<s.length;i++){//由于已给root赋值,所以i从1开始
                            LinkNode temp=new LinkNode(s[i]);//每循环一次生成一个新的节点,并给当前节点赋值
                            other.setNext(temp);//将other的下一个节点指向生成的新的节点
                            other = temp;//将other指向最后一个节点(other的下一个节点)     
                   }

 

 

 

 

 

 

具体代码实现如下:

/**
 * 将数组转换成链表输出
 * @author zr
 *
 */
public class Test2 {
	private static LinkNode root;
	

	/**
	 * 程序入口处
	 * @param args
	 */
	public static void main(String[] args) {
		Test2 t2=new Test2();
		String [] s=new String[]{"a1","a2","a3","a4"};
		root=t2.LinkList(s);
		t2.printLinkList(root);
	}
	
	/**
	 * 创建一个链表
	 * @param s 一个字符串
	 * @return 返回链表根节点
	 */
	public LinkNode LinkList(String [] s){
		root=new LinkNode(s[0]);//生成链表的根节点,并将数组的第一个元素的值赋给链表的根节点
		LinkNode other=root;//生成另一个节点,并让other指向root节点,other在此作为一个临时变量,相当于指针
		for(int i=1;i<s.length;i++){//由于已给root赋值,所以i从1开始
			LinkNode temp=new LinkNode(s[i]);//每循环一次生成一个新的节点,并给当前节点赋值
			other.setNext(temp);//将other的下一个节点指向生成的新的节点
			other = temp;//将other指向最后一个节点(other的下一个节点)	other=other.getNext();
			
		}
		return root;
	}
	
	/**
	 * 遍历一个链表
	 * @param root
	 */
	public void printLinkList(LinkNode root){
		if(root!=null){
			Object data=root.getObj();//获得根节点的值
			String s=(String)data;//将data强制转型为String类型
			System.out.println(s);
			LinkNode temp2=root.getNext();//将根节点的下一个节点赋给temp2
			printLinkList(temp2);//递归
		}
	}

}

 

结果为:

a1
a2
a3
a4

 

 

 

2、 链表转换成数组:

 

 

 

int size=LinkListSize(lr);//获得链表的长度

Object [] obj=new Object[size];

obj[0]=lr.getObj();//将根节点的值赋给数组的第一个元素

LinkNode tem=lr;

for(int i=1;i<size;i++){

        LinkNode tem1=tem.getNext();

        obj[i]=tem1.getObj();

        tem=tem1;

}

 

 

 

  

 

具体代码实现如下:

 

 

/**
 * 把链表转换成数组
 * @author zr
 *
 */
public class Test3 {
	private int size=1;
	private int count;
	private static LinkNode root;
	static Test3 t3=new Test3();
	
	public static void main(String [] args){
		root=t3.createLinkList();//取得创建好的链表
		System.out.println("需要转换的链表为:");
		t3.printLinkList(root);//打印出链表
		t3.LinkList_Array(root);
	}

	/**
	 * 将一个链表转换成数组
	 * @param root 链表的根节点
	 */
	public void LinkList_Array(LinkNode lr){

		int size=LinkListSize(lr);//获得链表的长度
		Object [] obj=new Object[size];
		obj[0]=lr.getObj();//将根节点的值赋给数组的第一个元素
		LinkNode tem=lr;
		for(int i=1;i<size;i++){
			
			LinkNode tem1=tem.getNext();
			obj[i]=tem1.getObj();
			tem=tem1;
		}	
		System.out.println("该链表转换成数组为:");
		printArray(obj);
	}
	
	/**
	 * 遍历数组
	 * @param obj 被遍历的数组
	 */
	public void printArray(Object[] obj){
		for(int i=0;i<obj.length;i++){
			System.out.println(i+" "+obj[i]);
		}
	}
	
	/**
	 * 创建一个链表
	 * @return 返回链表根节点
	 */
	public LinkNode createLinkList(){
		root=new LinkNode("根节点");
		LinkNode n1=new LinkNode("节点1");
		LinkNode n2=new LinkNode("节点2");
		LinkNode n3=new LinkNode("节点3");
		LinkNode n4=new LinkNode("节点4");
		root.setNext(n1);
		n1.setNext(n2);
		n2.setNext(n3);
		n3.setNext(n4);
		return root;
		
	}
	
	/**
	 * 遍历链表
	 * @param root 链表的根节点
	 */
	public void printLinkList(LinkNode root){
		if(root!=null){
			count++;
			Object obj=root.getObj();
			System.out.println(count+"  "+obj);
			LinkNode temp=root.getNext();
			printLinkList(temp);
		}
	}
	
	public int LinkListSize(LinkNode root){
		LinkNode tem=root;//tem1指向root节点
		
		while(tem.getNext()!=null){
			size++;
			LinkNode tem1=tem.getNext();//tem1指向tem的下一个节点
			tem=tem1;//将tem指向tem1
		}
		return size;
		
	}
	
	
}

 

 

 

结果为:

需要转换的链表为:
1  根节点
2  节点1
3  节点2
4  节点3
5  节点4
该链表转换成数组为:
0 根节点
1 节点1
2 节点2
3 节点3
4 节点4

 

 

 

  • 大小: 58.7 KB
  • 大小: 10.1 KB
  • 大小: 59.1 KB
  • 大小: 56.3 KB
分享到:
评论

相关推荐

    6fedcom#fe-blog#js实现数组和链表之间相互转换1

    数组转链表//方法1pnode = node //将node赋值给pnode//方法2 递归var rest = arrayToLink(ary, start

    C++数据结构-二叉树和线索二叉树

    添加、删除、拷贝、清空、树深度计算、父节点、兄弟节点获取、先中后序递归及非遍历、按层次遍历、中序迭代器(非递归算法)、节点查找、先序和中序序列重建二叉树、数组和二叉链表存储结构相互转换。使用模板偏特化...

    C语言程序设计标准教程

    通过结构指针即可访问该结构变量, 这与数组指针和函数指针的情况是相同的。结构指针变量说明的一般形式为: struct 结构名*结构指针变量名 例如,在前面的例7.1中定义了stu这个结构, 如要说明一个指向stu的指针...

    多种数据结构及常用函数(静态库)

    C++ 单字节字符串 宽字节字符串 字符串 跟 整数 小数相互转化 字符串截取,插入,分离,组合,查找,格式化等 高效循环链表 固定线性数组 常用函数及结构

    多种数据结构及常用函数(源)

    C++ 单字节字符串 宽字节字符串 字符串 跟 整数 小数相互转化 字符串截取,插入,分离,组合,查找,格式化等 高效循环链表 固定线性数组 常用函数及结构

    数据结构:八大数据结构分析.pdf

    数据结构:⼋⼤数据结构分析 数据结构分类 数据结构是指相互之间存在着⼀种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成 。 常⽤的数据结构有:数组,栈,链表,队列,树,图,堆,散列表等,如图所...

    计算机二级公共基础知识

    由于数据元素在计算机存储空间中的位置关系可能与逻辑关系不同,因此,为了表示存放在计算机存储空间中的各数据元素之间的逻辑关系(即前后件关系),在数据的存储结构中,不仅要存放各数据元素的信息,还需要存放各...

    c语言数据结构算法演示(Windows版)

    19. 森林和二叉树的相互转换 图示窗口在显示屏的上方,其左侧为森林,右侧为二叉树。 20. 赫夫曼树和赫夫曼编码 图示窗口显示生成的赫夫曼树的逻辑结构和每个叶子结点的编码。 21. 图的深度优先搜索 图示窗口的上...

    嵌入式C语言面试题汇总(超经典).pdf

    对于指针不能仅停留在取址、加减运算这基本印象上,至少要达到知道指针与数组名的区别,知道char、int等指针类型的区别以及它们的相互转换方法,知道函数指针与指针函数的使用以及区别等等。在学习过程中要找准自己...

    软件工程之专题九:数据结构知识

    通常使用一个足够大的数组,从数组的第一个元素开始,将线性表的结点依次存储在数组中。 顺序存储方式优点:能直接访问线性表中的任意结点。 线性表的第i个元素a[i]的存储位置可以使用以下公式求得: LOC(ai)=LOC...

    Absolute C++中文版(原书第2版)-完美的C++教程,文档中还包含英文版

    9.3.4 string类对象和C字符串的相互转换 273 第10章 指针和动态数组 280 10.1 指针 280 10.1.1 指针变量 280 10.1.2 内存管理基础 287 10.1.3 动态变量和自动变量 289 10.1.4 指针的应用 292 10.2 动态数组 ...

    考研-数据结构-殷人昆.zip

    6.3 树和森林与二叉树的互相转换 155 6.3.1 树转换为二叉树 155 6.3.2 二叉树转换为树 156 6.3.3 森林转换为二叉树 156 6.3.4 二叉树转换为森林 157 6.3.5 树和森林的遍历 157 6.4 树与二叉树的应用 158 6.4.1 二叉...

    你必须知道的495个C语言问题.pdf

    4.14 怎样在整型和指针之间进行转换?能否暂时把整数放入指针变量中,或者相反? 4.15 我怎样把一个int变量转换为char *型?我试了类型转换,但是不行。 第5章 空指针 空指针和空指针常量 5.1 臭名昭著的空指针到底...

    2005-2009软件设计师历年真题

     • 数组(静态数组、动态数组)、线性表、链表(单向链表、双向链表、循环链表)、队列、栈、树(二叉树、查找树、平衡树、线索树、线索树、堆)、图等的定义、存储和操作  • Hash(存储地址计算,冲突处理)  ...

    leetcode实践

    17种排列组合46排序组合48排序组合78排序组合22递归创建括号回溯39个向量递归组合回溯120个向量递归组合回溯437相互调用转换度高637 BFS试图估计已经有维二维结果存储94 144 145递归实现深度遍历以及使用栈实现深度...

    你必须知道的495个C语言问题

    4.14 怎样在整型和指针之间进行转换?能否暂时把整数放入指针变量中,或者相反? *4.15 我怎样把一个int变量转换为char*型?我试了类型转换,但是不行。 第5章 空指针 空指针和空指针常量 5.1 臭名昭著的空...

    Java范例开发大全 (源程序)

     实例212 List、Set与Array之间的相互转换 375  实例213 二分查找法的实现方法 377  实例214 模拟操作系统的进程调度 379  实例215 利用栈将字符串逆序输出 381  实例216 动态的数组链表 382  实例217 你...

    java范例开发大全(pdf&源码)

    实例212 List、Set与Array之间的相互转换 375 实例213 二分查找法的实现方法 377 实例214 模拟操作系统的进程调度 379 实例215 利用栈将字符串逆序输出 381 实例216 动态的数组链表 382 实例217 你能猜出鱼是谁的...

    脑力保健 微软,GOOGLE等试题试做 C#版

    输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ / \ 4 8 12 16 转换成双向链表 4=6=8=10=12=14=16。 n个数字(0,1,...

    java范例开发大全源代码

     实例55 一维数组的创建与使用 78  实例56 按相反的顺序输出 79  实例57 奇偶分组 80  实例58 找宝 81  实例59 寻找最小数 82  实例60 我的位置在哪里 83  实例61 复制数组 85  实例62 插入...

Global site tag (gtag.js) - Google Analytics