数据结构(三) Java实现静态链表的顺序新增、指定位置新增和删除

参照着大话数据结构中的思想,实现了一下静态链表的新增和删除,记录下来;

一:定义:

静态链表:数组描述的链表,即称为静态链表。


图 1 -1


图 1-2

如图所示:静态链表有几个关键点:

(1).静态链表每个实际元素由数据和cur两部分组成

(2).静态链表的首元素和尾元素都不存储实际的数据元素;

(3).首元素cur存储备用链表的元素的下标,尾元素cur存储第一个有效元素的下标;最后一个有效元素的cur指向0

二:演示:

1.新增前链表可见图1-2:

新增后:演示的是向指定位置处新增元素,此处是index =3,即向乙和丁之间插入一个丙



图 1 - 3

插入后可见:


思路:

(1.).找到带插入索引前一个元素,获取到此时的cur值和下标tmp

(2).获取此时首元素存储的cur:备用链表的下标,也是此时待插入元素的下标  -- newCur

(3).将前一个元素的cur指向此时待插入元素的下标  -- newCur;

(4).将待插入元素的cur指向原来前一个元素的cur值,tmp

(5)将首元素存储的cur  变成原来的值+1;

/**
	 * 向指定位置插入数据 1.先将带插入的这个放在备用链表的第一条,记做k,然后将首元素的游标指向备用链表的下一个的下标k+1
	 * 2.不在第一条的情况:插入前index-1的位置list[index-1].cur = list[k]的下标
	 * 3.list[k]的游标指向原来第三个位置处的坐标
	 * 
	 * @param index
	 * @param element
	 * @return
	 */
	public boolean addTo(int index, Object element) {
		if (index < -1 || index > length || element == null) {
			return false;
		}
		// 备用链表的第一个元素下标,也是待插入元素位置的下标newcur
		int newCur = linklist[0].cur;

		// 拿到前一个元素的下标
		int ccur = linklist.length - 1;// 获取第一个有效元素的下标
		for (int i = 1; i < index; i++) {
			ccur = linklist[ccur].cur;
		}
		// 出来后ccur=2
		int tmp = linklist[ccur].cur;//存储原来前一个元素的cur == 3(此时为3)
		linklist[ccur].cur = newCur;// 将原来之前有个元素的游标设置为新插入的元素位置的下标(newcur)
		linklist[newCur].cur = tmp;// 将新插入的这个元素的下标设置为插入前,index元素前一个元素的游标ccur
		linklist[newCur] = new Node(tmp, element);
		linklist[0].cur = newCur + 1;
		length++;
		return true;
	}

2.删除

(1).找出删除位置的前一个元素的cur,也就是删除位置的下标tmp;

(2)根据tmp获取删除位置的cur,用来赋值给前一个元素的cur

(3)获取首元素的cur,也就是删除前备用链表的第一个位置的下标newfree;

(4)将删除元素的cur设置成newFree;将首元素的cur设置成删除元素的下标;代表这个删除位置已经到备用链表中的第一个位置,下次新增优先插到这个地方;

/**
	 * 1.找出前一个元素的cur ,也就是删除位置元素的下标 --- 并将前一个元素的cur指向删除索引的后一个元素的下标
	 * 2.删除的这个索引处元素进入备用链表的第一个,cur指向原来的备用链表第一个下标,首元素cur指向该索引处元素下标
	 * 
	 * @param index
	 * @return
	 */
	public boolean delete(int index) {

		// 以index = 1为例
		if (index < -1 || index > length) {
			return false;
		}
		int ccur = size - 1;
		for (int i = 1; i < index; i++) {
			ccur = linklist[ccur].cur;
		}

		int tmp = linklist[ccur].cur;// 获取前一个元素的cur,也就是删除元素的下标
		int newCur = linklist[tmp].cur;// 获取删除元素的cur
		linklist[ccur].cur = newCur;

		int newFree = linklist[0].cur;// 获取原来链表的备用链表的第一个坐标

		linklist[0].cur = tmp;// 将首元素的cur设置成删除位置处的下标
		linklist[tmp].cur = newFree;
		size--;
		return true;
	}


下面是所有的代码


public class StaticLinkList {

	// 定义一个大的长度
	int size = 1000;
	Node[] linklist;// 定义一个数组

	int length;//定义一个有效元素的长度;

	// 初始化一个大小为1000的静态链表
	StaticLinkList() {
		linklist = new Node[1000];
		for (int i = 0; i < size - 1; i++) {
			linklist[i] = new Node(i + 1, null);
		}
		linklist[size - 1] = new Node(0, null);// 最后一个元素的角标指向第一个有值元素的下标
	}



	// 顺序新增元素
	public boolean add(Object element) {
		// 插入前备用链表首元素游标,也是新元素的下标
		int newCur = linklist[0].cur;
		// 保存当前最新的元素的游标
		int temp = linklist[newCur].cur;
		// 封装到node中
		Node newNode = new Node(0, element);
		linklist[newCur] = newNode;
		// 假如新增元素前就有实际元素,那么新增后需要将之前的最后一个元素的cur置为新增后最后一个元素的下标
		if (linklist[0].cur > 1) {
			linklist[newCur - 1].cur = newCur;
		}
		// 将temp赋值给首元素的cur;
		linklist[0].cur = temp;
		// 将列表最后一个元素的游标置为首个有效元素的下标
		linklist[size - 1].cur = 1;
		length++;
		return true;
	}

	/**
	 * 向指定位置插入数据 1.先将带插入的这个放在备用链表的第一条,记做k,然后将首元素的游标指向备用链表的下一个的下标k+1
	 * 2.不在第一条的情况:插入前index-1的位置list[index-1].cur = list[k]的下标
	 * 3.list[k]的游标指向原来第三个位置处的坐标
	 * 
	 * @param index
	 * @param element
	 * @return
	 */
	public boolean addTo(int index, Object element) {
		if (index < -1 || index > length || element == null) {
			return false;
		}
		// 备用链表的第一个元素下标,也是待插入元素位置的下标newcur
		int newCur = linklist[0].cur;

		// 拿到前一个元素的下标
		int ccur = linklist.length - 1;// 获取第一个有效元素的下标
		for (int i = 1; i < index; i++) {
			ccur = linklist[ccur].cur;
		}
		// 出来后ccur=2
		int tmp = linklist[ccur].cur;//存储原来前一个元素的cur == 3(此时为3)
		linklist[ccur].cur = newCur;// 将原来之前有个元素的游标设置为新插入的元素位置的下标(newcur)
		linklist[newCur].cur = tmp;// 将新插入的这个元素的下标设置为插入前,index元素前一个元素的游标ccur
		linklist[newCur] = new Node(tmp, element);
		linklist[0].cur = newCur + 1;
		length++;
		return true;
	}
	
	
	
	public boolean delete(int index){
		
		
		
		
	}

	static class Node {
		int cur;
		Object element;

		Node(int cur) {
			this.cur = cur;
		}

		Node(int cur, Object element) {
			this.cur = cur;
			this.element = element;
		}
	}

	public static void main(String[] args) {
		StaticLinkList list = new StaticLinkList();
		for (int i = 0; i < 4; i++) {
			if (i == 0) {
				list.add("甲");
			}
			if (i == 1) {
				list.add("乙");
			}
			if (i == 2) {
				list.add("丁");
			}
			if (i == 3) {
				list.add("午");
			}
		}
		list.addTo(3, "丙");
		System.out.println(list);
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值