无法将链表的类语法转换为函数语法



好的,我正在学习数据结构,我的教程将遵循class语法。因此,现在我正试图将它转换为function声明,因为我想用这种表示法练习链表。有人能帮我转换吗?我只需要转换一个方法,就可以完成其余的操作。

以下是我使用class语法的代码:

class Node {
constructor( val ) {
this.val = val;
this.next = null;
}
}
class SinglyLinkedList {
constructor () {
this.head = null;
this.tail = null;
this.length = 0;
}
push( val ) {
const newNode = new Node( val );
if ( !this.head ) {
this.head = newNode;
this.tail = this.head;
} else {
this.tail.next = newNode;
this.tail = newNode;
}
this.length++
return this;
}
}
const list = new SinglyLinkedList();
list.push( 'HELLO' );
list.push( 'WORLD' );

以下是我迄今为止尝试实现的基于功能的方法:

function Node( val ) {
this.val = val;
this.next = null;
}
let head = null;
let tail = null;
let length = 0;
const SinglyLinkedListFunc = function() {
const newNode = new Node( 'HELLO' );
};
SinglyLinkedListFunc()

这是我迄今为止所能取得的成就。我被它卡住了,我不知道下一步该怎么办。有人请帮助

功能继承

链表是一个函数结构,因此将其与函数样式一起使用会产生最佳结果。这意味着要避免突变和变量重新分配。下面我们在面向对象的接口中实现了一个函数式的不可变链表

class Node {
constructor(head, tail) {
this.head = head
this.tail = tail
}
}
const empty = Symbol("empty")

class List {
constructor(t = empty) {
this.t = t
}
push(v) {
return new List(new Node(v, this.t))
}
toString() {
if (this.t == empty)
return "∅"
else
return `${this.t.head} -> ${new List(this.t.tail)}`
}
}
const l = (new List).push("a").push("b").push("c")
console.log(String(l))
console.log(String(l.push("d").push("e").push("f")))
console.log(String(l))

请注意,每次调用.push都会返回一个新的、未修改的列表-

c -> b -> a -> ∅
f -> e -> d -> c -> b -> a -> ∅
c -> b -> a -> ∅

首选模块,可选类别

但我认为你可以做得更好。通过将函数设计和关注点直接与面向类的语义混合,我们最终会得到奇怪且往往效率低下的程序。在函数风格中,我们用普通函数编写模块。如果需要一个面向对象的接口,那么只需要围绕我们的普通函数的一个薄薄的包装器——

// list.js
const empty = Symbol("empty")
const pair = (left, right) =>
({ left, right })
const push = (t, v) =>
pair(v, t)
const list = (...args) =>
args.reduce(push, empty)
const toString = t =>
t == empty
? "∅"
: `${t.left} -> ${toString(t.right)}`

class List {
constructor(t = empty) { this.t = t }
static empty() { return new List() }
static of(...args) { return new List(list(...args)) }
push(v) { return new List(push(this.t, v)) }
toString() { return toString(this.t) }
}
export { default:List, empty, pair, push, list, toString }

在您的模块中,我们将从列表中导入list-

// main.js
import List from "./list.js"
const l = List.empty().push("a").push("c").push("d")
console.log(String(l))
console.log(String(l.push("d").push("e").push("f")))
console.log(String(l))
c -> b -> a -> ∅
f -> e -> d -> c -> b -> a -> ∅
c -> b -> a -> ∅

展开下面的代码段以验证浏览器中的结果-

// list.js
const empty = Symbol("empty")
const pair = (left, right) =>
({ left, right })
const push = (t, v) =>
pair(v, t)
const list = (...args) =>
args.reduce(push, empty)
const toString = t =>
t == empty
? "∅"
: `${t.left} -> ${toString(t.right)}`

class List {
constructor(t = empty) { this.t = t }
static empty() { return new List() }
static of(...args) { return new List(list(...args)) }
push(v) { return new List(push(this.t, v)) }
toString() { return toString(this.t) }
}
// main.js
const l = List.empty().push("a").push("c").push("d")
console.log(String(l))
console.log(String(l.push("d").push("e").push("f")))
console.log(String(l))

以下是功能方法:

function Node( val, next ) {
this.val = val;
this.next = null;
}

const SinglyLinkedListFunc = function() {
this.head = null;
this.tail = null;
this.length = 0;
};
SinglyLinkedListFunc.prototype.push = function( val ) {
const newNode = new Node( val );
if( !this.head ){
this.head = newNode;
this.tail = newNode;
} else{
this.tail.next = newNode;
this.tail = newNode;
}
this.length++;
return this;
}

let list = new SinglyLinkedListFunc();
list.push('HELLO');
list.push('WORLD');

相关内容

  • 没有找到相关文章

最新更新