实现图-邻接表
class Vertex { constructor(V) { this.data = V; // 顶点 this.adj = []; // 邻接表数组实现 }}
// 模仿实现一个无向图的邻接表实现class UndirectedListGraph { constructor(size){ this.vertexesList = new Array(size); this.edges = 0; this.vertexes = 0; } edgeSize() { return this.edges; } vertexesSize() { return this.vertexes; } // 增加顶点 addVertex(vertex) { this.vertexesList[this.vertexes] = new Vertex(vertex); this.vertexes++; } // 新增一条边 addEdge(from, to, weight = 1) { const i = this.getPosition(from); const j = this.getPosition(to); this.vertexesList[i].adj.push(j); this.vertexesList[j].adj.push(i); this.edges++; } getPosition(v) { for(let i = 0; i < this.vertexes; i++) { if(this.vertexesList[i].data === v) return i; } return -1; } // 删除一条边 removeEdge(from, to) { const i = this.getPosition(from); const j = this.getPosition(to); this.vertexesList[i].adj.splice(j, 1); this.vertexesList[j].adj.splice(i, 1); this.edges--; } // 删除一个顶点 removeVertex(v) { /** * 删除一个顶点 * 1. 查问顶点V的序号index * 2. 更新边的个数 * 3. 删除所有邻接点对应的index * 4. 在数组中删除以后顶点 * 5. 更新顶点的个数 * 6. 更新所有邻接表的序号值大于1的值,将所有大于index的值全副减1 */ let index = this.getPosition(v); this.edges = this.edges - this.degree(v); this.vertexesList[index].adj.map((it, i) =>{ const removeIndex = this.vertexesList[it].adj.findIndex((v) => v === index); this.vertexesList[it].adj.splice(removeIndex, 1); }) // // 删除以后的顶点 for(let i = index; i < this.vertexes - 1; i++){ this.vertexesList[i] = this.vertexesList[i + 1]; } this.vertexes--; for(let i = 0; i < this.vertexes; i++) { this.vertexesList[i].adj = this.vertexesList[i].adj.map(it => it > 1 ? it - 1 : it ) } } // 某个顶点的度 degree(v) { return this.vertexesList[this.getPosition(v)].adj.length; } // 显示图 displayGraph() { console.log('这是一个无向图,邻接表存储的图'); console.log('顶点信息', this.vertexesList); for(let i = 0; i < this.vertexes; i++) { console.log(this.vertexesList[i].data); console.log(`邻接表: ${this.vertexesList[i].adj}`) } }}const graph = new UndirectedListGraph(10);graph.addVertex('A');graph.addVertex('B');graph.addVertex('C');graph.addVertex('D');graph.addVertex('E');graph.addVertex('F');console.log(graph, 'graph')graph.addEdge('A', 'B');graph.addEdge('A', 'D');graph.addEdge('B', 'C');graph.addEdge('B', 'E');graph.addEdge('C', 'D');graph.addEdge('C', 'F');graph.addEdge('D', 'F');graph.addEdge('E', 'F'); graph.displayGraph()graph.removeVertex('B');graph.displayGraph()console.log(graph.degree('C'), '----')