java算法:链表

java算法:链表

链表是一种基本的数据结构,它是多个数据项的集合。链表相对于数组的主要优点在于给我们提供了重新有效地组织数据项的能力,这种便利牺牲快速访问链表中的数据项为代价,因为访问链表就是从开始指针往下查。

在一些编程环境中,链表是基本的数据结构,但是在java中不是。我们构建类,Node:

Java代码 复制代码
  1. classNode{
  2. Objectitem;
  3. Nodenext;
  4. }
class Node{
	Object item;
	Node next;
}

要有效地使用链表,内存分配是需要考虑的主要因素。

Java代码 复制代码
  1. Nodex=newNode();
Node x = new Node();

当我们使用链表结构时,对每个对象的所有成员都进行初始化。因为调用构造函数是实例化对象过程的一部分,所以我们可以在每个构造函数中给每个数据域赋值。

Java代码 复制代码
  1. classNode{
  2. Ojbectitem;
  3. Nodenext;
  4. Node(Ojbectv){
  5. item=v;
  6. next=null;
  7. }
  8. }
class Node{
	Ojbect item;
	Node next;
	Node(Ojbect v){
		item = v;
		next = null;
	}
}

注意:

要移走节点x后的节点:

t = x.next; x.next = t.next;

在x后插入节点:

t.next = x.next; x.next = t;

插入和删除的简单性是链表存在的理由。要在数组中进行相应的操作就很不方便,因为它们要移动被影响的数据项之后的所有数据项。

链表并不适合有效访问第k项操作的查找。在数组中简单访问a[k]找到第k项。而在链表中,需要遍历k个指针。

当使用 x.next = x.next.next;语句从链表中移走节点时,可能再也不能访问到它了。在java中,这个不需要特别关心,因为java会自动把没有被引用的内存回收。

例一:循环链表例子(约瑟芬问题:N个人围成一圈,每隔M-1个人就去掉一人,然后剩下的人再靠拢,问题是谁是最后剩下的人):

Java代码 复制代码
  1. publicclassJosephus{
  2. publicstaticvoidmain(String[]args){
  3. intN=Integer.parseInt(args[0]);
  4. intM=Integer.parseInt(args[1]);
  5. Nodet=newNode(1);
  6. Nodex=t;
  7. for(inti=2;i<=N;i++){
  8. x=(x.next=newNode(i));
  9. }
  10. x.next=t;
  11. while(x!=x.next){
  12. for(inti=1;i<M;i++){
  13. x=x.next;
  14. }
  15. x.next=x.next.next;
  16. }
  17. System.out.println("survivoris"+x.val);
  18. }
  19. publicstaticclassNode{
  20. intval;
  21. Nodenext;
  22. Node(intv){
  23. val=v;
  24. }
  25. }
  26. }
public class Josephus {

	public static void main(String[] args) {
		int N = Integer.parseInt(args[0]);
		int M = Integer.parseInt(args[1]);
		Node t = new Node(1);
		Node x = t;
		for(int i = 2; i <= N; i++){
			x = (x.next = new Node(i));
		}
		x.next = t;
		while(x != x.next){
			for(int i = 1; i < M; i++){
				x = x.next;
			}
			x.next = x.next.next;
		}
		System.out.println("survivor is " + x.val);
	}
	public static class Node{
		int val;
		Node next;
		Node(int v){
			val = v;
		}
	}
}

当N=9,M=5,剩下的是8。

埃拉托色尼筛和约瑟芬问题明显说明了使用数组和链表来分别表示顺序组织的对象集合之间的差异。如果分别使用链表和数组来解决问题,开销会很大。

在java中,对象和对象的引用为链表这个概念提供了直接、便捷的具体实现手段。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值