线性表之顺序表增强操作

一,线性表的一些增强操作

1,合并有序顺序表

两个索引,分别指向两个顺序表的0索引,然后进行相互比较大小,索引前移.

需要注意的是,两个顺序表可能会有一个先遍历完,所以最后判断是否要有剩余未遍历的

 

2,删除某个范围内的元素

和删除某个元素思路一致

 

3,将顺序表元素进行重组, 小于等于某个value的放在左端,大于这个value的放在右边

类似快速排序的一趟排序过程. 使用两个索引, 一个头,一个尾,相向移动

 

4,删除顺序表中所有重复的元素

初试条件可以把[0]做不重复区间,然后1索引出与[0]区域比较,如果没有重复的,放入区域[0 1]

然后2索引与[0 1]进行比较,如果不重复,放入区域[0,1,2]

....

直至完毕

 

5,删除有顺序表中所有重复的元素

因为有序,所以一趟遍历就可以解决,每次i索引处的值和i-1处的索引值比较即可

 

二,对应代码如下:

 

package com.zl.ds;

public class SequenceListAlgorithm {
	/**
	 * 有序顺序表的归并
	 * 
	 * @param first
	 *            有序顺序表
	 * @param second
	 *            有序顺序
	 * @return first和second有序顺序表合并后的结果
	 */
	// 利用两个下标分别表示first和second, 向前比较.注意,其中一个可能先访问完毕,另外一个有剩余元素没有访问
	public SequenceList<Integer> mergeOrderedSeqList(SequenceList<Integer> first, SequenceList<Integer> second) {

		if (first == null) {
			return second;
		}

		if (second == null) {
			return first;
		}

		int i = 0, j = 0;
		int firstLen = first.size(), secondLen = second.size();
		SequenceList<Integer> mergedList = new SequenceList<Integer>(firstLen + secondLen);
		int index = 0;
		// first和second循环比较,直到其中一个访问完毕
		while (i < firstLen && j < secondLen) {
			if (first.get(i) < second.get(j)) {
				mergedList.insert(index++, first.get(i));
				i++;
			} else {
				mergedList.insert(index++, second.get(j));
				j++;
			}
		}

		// first和second长短不一,未访问完毕的继续进行merge
		while (i < firstLen) {
			mergedList.insert(index++, first.get(i));
			i++;
		}

		while (j < secondLen) {
			mergedList.insert(index++, second.get(j));
			j++;
		}

		return mergedList;
	}

	/**
	 * 从给定的顺序表中删除值在x到y之间的所有元素
	 * 
	 * @param list
	 *            顺序表
	 * @param x
	 * @param y
	 */
	public void deleteRange(SequenceList<Integer> list, int x, int y) {
		if (list == null) {
			return;
		}

		int index = 0;
		for (int i = 0, len = list.size(); i < len; i++) {
			if (list.get(i) >= x && list.get(i) <= y) {
				continue;
			} else {
				list.set(index++, list.get(i));
			}
		}

		for (int i = index; i < list.size(); i++) {
			list.set(index, null);
		}

		list.setSize(index);
	}

	/**
	 * 小于等于value的值放在左边,大于value的值放在右边
	 * 
	 * @param list
	 * @param value
	 */
	// 利用两个指针前后查找,直到两者相遇
	public void moveElemByValue(SequenceList<Integer> list, int value) {
		if (list == null || list.size() <= 0) {
			return;
		}

		int front = 0, rear = list.size() - 1;

		while (front < rear) {
			while (front < rear && list.get(front) <= value) {
				front++;
			}

			while (front < rear && list.get(rear) > value) {
				rear--;
			}

			int temp = list.get(front);
			list.set(front++, list.get(rear));
			list.set(rear--, temp);
		}
	}

	/**
	 * 删除顺序表中所有重复的元素
	 * 
	 * @param list
	 */
	public void deleteAllDul(SequenceList<Integer> list) {
		if (list == null || list.size() <= 1) {
			return;
		}

		int index = 1;
		for (int i = 1, len = list.size(); i < len; i++) {
			//标识是否有重复
			boolean flag = true;
			for (int j = 0; j < index; j++) {
				if (list.get(i) == list.get(j)) {
					flag = false;
					continue;
				}
			}

			if (flag) {
				list.set(index++, list.get(i));
			}
		}

		list.setSize(index);
	}

	/**
	 * 从有序顺序表中删除重复的元素,并使剩下的元素相对位置不变
	 * 
	 * @param list
	 */
	public void deleleOrderedListAllDul(SequenceList<Integer> list) {
		if (list == null || list.size() <= 1) {
			return;
		}

		int index = 0;
		for (int i = 1, len = list.size(); i < len; i++) {
			if (list.get(i) != list.get(index)) {
				list.set(++index, list.get(i));
			}
		}

		list.setSize(++index);
	}
	
}


 

代码下载

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值