Java数据结构(链表篇)

链表是一种物理存储单元上非连续、非顺序的存储结构数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,链表比较方便插入和删除操作。


连接点:

package ch04Link;

public class Link {

	// 数据域
	private long data;
	
	// 指针域
	private Link next;
	
	// 构造函数
	public Link(long data) {
		this.data = data;
	}

	public long getData() {
		return data;
	}

	public void setData(long data) {
		this.data = data;
	}

	public Link getNext() {
		return next;
	}

	public void setNext(Link next) {
		this.next = next;
	}
	
	
	
}

测试连接点:

package ch04Link;

public class TestLink {

	public static void main(String[] args) {
		Link link1 = new Link(10);
		Link link2 = new Link(50);
		Link link3 = new Link(20);
		Link link4 = new Link(100);
		
		link1.setNext(link2);
		link2.setNext(link3);
		link3.setNext(link4);
		
		System.out.println(link1.getData());
		System.out.println(link1.getNext().getData());
		System.out.println(link1.getNext().getNext().getData());
		System.out.println(link1.getNext().getNext().getNext().getData());
	}
}

链表:

package ch04Link;

/**
 * 链表:核心思想:链表中只包含一个数据项,即对第一个连接点的引用
 * @author hadoop
 *
 */
public class LinkList {

	private Link first;
	
	// 插入
	public void insert(long value){
		Link link = new Link(value);
		if(first == null)
			first = link;
		else{
			link.setNext(first);
			first = link;
		}
	}
	
	// 打印链表
	public void display(){
		Link current = first;
		while(current != null){
			System.out.print(current.getData() + " ");
			current = current.getNext();
		}	
	}
	
	// 查询链表 
	public Link find(long key){
		Link current = first;
		while(current.getData() != key){
			if(current.getNext() == null)
				return null;
			current = current.getNext();
		}
		return current;
	}
	
	// 插入节点到指定位置
	public void insert(long value, int pos){
		if(pos == 0)
			insert(value);
		else{
			Link current = first;
			for(int i = 0; i < pos - 1; i++)
				current = current.getNext();
			Link link = new Link(value);
			link.setNext(current.getNext());
			current.setNext(link);
		}
	}
	
	// 删除节点
	public void delete(long value){
		Link current = first;
		Link ago = first;
		while(current.getData() != value){
			if(current.getNext() == null)
				return;
			else{
				ago = current;
				current = current.getNext();
			}
		}
		if(current == first)
			first = first.getNext();
		else
			ago.setNext(current.getNext());
	}
}

测试:

package ch04Link;

public class TestLinkList {

	public static void main(String[] args) {
		LinkList linkList = new LinkList();
		
		linkList.insert(20);
		linkList.insert(80);
		linkList.insert(40);
		linkList.insert(60);
		linkList.display();
		System.out.println();

		System.out.println("找到节点,数据为:" + linkList.find(80).getData());
		
		linkList.insert(100, 0);
		linkList.display();
		
		System.out.println();
		
		linkList.delete(80);
		linkList.display();
	}
}

比较链表和顺序表:

package ch04Link;

import ch01Array.MyArray;

public class Test {

	public static void main(String[] args) {
		// 构造链表
		long date1 = System.currentTimeMillis();
		LinkList linkList = new LinkList();
		for(int i = 0; i < 1000000; i++)
			linkList.insert(i);
		long date2 = System.currentTimeMillis();
		System.out.println(date2 - date1);
		
		// 构造顺序表
		long date3 = System.currentTimeMillis();
		MyArray myArray = new MyArray(1000000 + 1);
		for(int i = 0; i < 1000000; i++)
			myArray.insert(i);
		long date4 = System.currentTimeMillis();
		System.out.println(date4 - date3);
		
		// 链表删除
		long date5 = System.currentTimeMillis();
		linkList.delete(60000);
		long date6 = System.currentTimeMillis();
		System.out.println(date6 - date5);
		
		// 顺序表删除
		long date7 = System.currentTimeMillis();
		myArray.delete(60000);
		long date8 = System.currentTimeMillis();
		System.out.println(date8 - date7);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值