Вот JavaScript для умножения с использованием SLL.
var x0 = {rank: 0, value: 11};
var x1 = {rank: 1, value: 5};
var x2 = {rank: 2, value: 7};
/* 11 + 5x + 7x^2 */
var SLL = {data: x0, next: {data: x1, next: {data: x2, next: null}}};
var DLL = {data: x0, prev: null, next: null};
DLL.next = {data: x1, prev: DLL, next: null};
DLL.next.next = {data: x2, prev: DLL.next, next: null};
function mulSLL(a, b) {
var result = null;
var m1 = a;
while(m1 != null) {
var m2 = b;
var mr = result; //re-use pointer into result
while(m2 != null) {
var val = {rank: m1.data.rank + m2.data.rank, value: m1.data.value * m2.data.value};
if(result == null) { //initial create
result = {data: val, next: null};
} else {
var mrold = null;
while(mr != null && mr.data.rank < val.rank) {
mrold = mr;
mr = mr.next;
}
if(mr != null) {
if(mr.data.rank == val.rank) { //merge
mr.data.value += val.value;
} else { // insert
var mrnext = mr.next;
mr.next = {data: val, next: mrnext};
}
} else { // add
mrold.next = {data: val, next: null};
}
}
m2 = m2.next;
}
m1 = m1.next;
}
// output result
mr = result;
while(mr != null) {
console.log(' + ' + mr.data.value + 'x^' + mr.data.rank);
mr = mr.next;
}
return result;
}
mulSSL(SLL,SLL);
- Редактировать * немного очистил код
Вы заметите, что большая часть логики происходитпостроение результата.Так как мои входные данные отсортированы от низшего ранга к высшему, мы действительно не получили бы много пользы, используя подход DLL вместо SLL.Я думаю, что основным отличием является объем памяти (DLL будет занимать дополнительный указатель места на диске 'prev' для каждого узла. Теперь, если входные данные НЕ отсортированы по 'rank' (читай: power), тогда использование результата DLL будетпозвольте нам начать с последнего вставленного узла и перейти к «предыдущий» или «следующий» на основе сравнения «ранг».