在进行单链表去重之前,我们先来考虑一下,数组如何就地去重。
我们可以很容易的编写出这样的代码:
如果通过正向遍历来删除的话,就要注意控制遍历的长度。
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();