diff --git a/src/data-structures/graph/Graph.js b/src/data-structures/graph/Graph.js index ba0b6d01..cd42fd31 100644 --- a/src/data-structures/graph/Graph.js +++ b/src/data-structures/graph/Graph.js @@ -138,6 +138,7 @@ export default class Graph { */ reverse() { /** @param {GraphEdge} edge */ + const reversedEdges = []; this.getAllEdges().forEach((edge) => { // Delete straight edge from graph and from vertices. this.deleteEdge(edge); @@ -145,7 +146,11 @@ export default class Graph { // Reverse the edge. edge.reverse(); - // Add reversed edge back to the graph and its vertices. + // Add reversed edge to the list of reversed edges. + reversedEdges.push(edge); + }); + reversedEdges.forEach((edge) => { + // Add reversed edge to the graph. this.addEdge(edge); }); diff --git a/src/data-structures/graph/__test__/Graph.test.js b/src/data-structures/graph/__test__/Graph.test.js index 936a69b8..bc0f17e3 100644 --- a/src/data-structures/graph/__test__/Graph.test.js +++ b/src/data-structures/graph/__test__/Graph.test.js @@ -305,6 +305,35 @@ describe('Graph', () => { expect(graph.getNeighbors(vertexD)[0].getKey()).toBe(vertexC.getKey()); }); + it('should be possible to reverse directed graph with cycle of lenght two', () => { + const vertexA = new GraphVertex('A'); + const vertexB = new GraphVertex('B'); + + const edgeAB = new GraphEdge(vertexA, vertexB); + const edgeBA = new GraphEdge(vertexB, vertexA); + + const graph = new Graph(true); + graph + .addEdge(edgeAB) + .addEdge(edgeBA); + + expect(graph.toString()).toBe('A,B'); + expect(graph.getAllEdges().length).toBe(2); + expect(graph.getNeighbors(vertexA).length).toBe(1); + expect(graph.getNeighbors(vertexA)[0].getKey()).toBe(vertexB.getKey()); + expect(graph.getNeighbors(vertexB).length).toBe(1); + expect(graph.getNeighbors(vertexB)[0].getKey()).toBe(vertexA.getKey()); + + graph.reverse(); + + expect(graph.toString()).toBe('A,B'); + expect(graph.getAllEdges().length).toBe(2); + expect(graph.getNeighbors(vertexA).length).toBe(1); + expect(graph.getNeighbors(vertexA)[0].getKey()).toBe(vertexB.getKey()); + expect(graph.getNeighbors(vertexB).length).toBe(1); + expect(graph.getNeighbors(vertexB)[0].getKey()).toBe(vertexA.getKey()); + }); + it('should return vertices indices', () => { const vertexA = new GraphVertex('A'); const vertexB = new GraphVertex('B');