单链表练习1--去重

在进行单链表去重之前,我们先来考虑一下,数组如何就地去重。

我们可以很容易的编写出这样的代码:

如果通过正向遍历来删除的话,就要注意控制遍历的长度。

function arrRemoveRepeatFront(arr) {
	for(var i=0; i<arr.length; ++i) {
		if(arr.indexOf(arr[i]) < i) {
			arr.splice(i, 1);
			i--;      // 保留前面遇到的元素,删除后面遇到的重复元素
		}
	}

	return arr;
}

console.log(arrRemoveRepeatFront([1, 2, 2, 2, 3, 3, 4, 3]))
console.log(arrRemoveRepeatFront([1]))

如果我们从数组尾部开始遍历,不用担心数组长度的改变。比较好理解

function arrRemoveRepeatBack(arr) {
	var index = arr.length - 1;
	while(index >= 0) {
		if(arr.indexOf(arr[index]) < index) {
			arr.splice(index, 1);
		}

		index--;     // 注意看index 是在if里面还是外面。
	}

	return arr;
}

好,我们借鉴上面的思路,
function LinkedList() {
	var Node = function (element) {
		this.element = element;
		this.next = null;
	}

	var head = null;   // keep the head pointer
	var length = 0;    // keep the length of linked list

	this.append = function (element) {
		var new_node = new Node(element);
		if(head == null) {
			head = new_node;
		}else {
			var current = head;
			while(current.next != null) {
				current = current.next;
			}

			current.next = new_node;
		}

		length++;
	}

	this.insert = function (position, element) {
		var new_node = new Node(element);
		if(position <= 0) {
			new_node.next = head;
			head = new_node;
			length++;
			return;
		}

		if(position > this.size() -1) {
			this.append(element);
			return;
		}

		var current = head;
		for(var i=1; i<position; ++i) {
			current = current.next;
		}

		new_node.next = current.next;
		current.next = new_node;
		length++;
	}

	this.remove = function (element) {
		var index = this.indexOf(element);
		if(index == -1) {
			return;
		}

		this.removeAt(index);
	}

	this.removeAt = function (position) {
		if(position < 0 || position > this.size() - 1) {
			throw new Error("Array index exceeds");
		}

		if(position == 0) {
			head = head.next;
		} else {
			var current = head;
			for(var i=1; i<position; ++i) {
				current = current.next;
			}
			current.next = current.next.next;
		}

		length--;
	}

	this.indexOf = function (element) {
		var current = head;
		var cnt = -1;
		while(current != null) {
			cnt++;
			if(current.element == element) {
				return cnt;
			}

			current = current.next;
		}

		return - 1;
	}

	this.size = function () {
		return length;
	}

	this.getHead = function () {
		return head;
	}

	this.print = function () {
		var current = head;
		var arr = []
		while(current != null) {
			arr.push(current.element);
			current = current.next;
		}

		console.log(arr.join(", "));
	}


}


/*
	删除重复的数据节点
*/

function removeRepeat(linked_list) {
	var current = linked_list.getHead();
	var index;
	var cnt = -1;
	while(current != null) {
		cnt++;
		index = linked_list.indexOf(current.element);
		if(index < cnt) {
			linked_list.removeAt(index);
			cnt--;
		}

		current = current.next;
	}

	return linked_list;
}

/*测试函数*/
function test(arr) {
	var link_list = new LinkedList();
	for(var i=0; i<arr.length; ++i) {
		link_list.append(arr[i]);
	}

	return link_list;
}

var arr = [10, 20, 20, 20, 30, 30, 40, 40, 50, 40];
var result = test(arr);
result.print();
var result_no_repeat = removeRepeat(result);
result_no_repeat.print();





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值