数据结构分为线性数据结构和非线性数据结构两大类。线性数据结构的主要缺点是我们不能以层次方式排列线性数据结构的数据,这就是为什么在计算机领域我们使用非线性数据结构。最常用的非线性数据结构是图和树,这两种数据结构都可以使用线性数据结构来实现。在本文中,我们将讨论如何使用链表表示图。
图由一组有限的顶点(或节点)和一组连接一对节点的边组成。图以两种不同的方式表示。一种方法是使用邻接表表示,第二种方法是邻接矩阵表示。由于使用列表表示进行动态内存分配,因此主要使用邻接列表表示。
图有两种类型:
- 有向图:在这种图排列中,每个节点都指向一个顶点,称为有向图。
- 无向图:在这种图排列中,使用双向顶点连接的两个节点称为无向图。
无向图表示:无向图中顶点的最大数量为n*(n-1) ,其中 n 是无向图中存在的节点总数。
无向图的LinkedList表示如下:
在无向图中,两个节点在双向顶点连接。我们可以同时使用数组列表和链表集合来表示无向图。在链表中,数据的操作比数组列表快,因为数组列表内部使用动态数组来存储数据,而链表使用双向链表,它在操作操作上更快,但在访问元素时速度更快。
实现:这里我们将讨论两种类型的图以实现相同的。
示例 1
Java
// Java Program to Implement the Unidirectional Graph
// Using Linked List
// Importing required classes from packages
import java.io.*;
import java.util.*;
// Main class
class GFG {
// Method 1
// To make pair of nodes
static void
addEdge(LinkedList > Adj, int u,
int v)
{
// Creating bi-directional vertex
Adj.get(u).add(v);
Adj.get(v).add(u);
}
// Method 2
// To print the adjacency list
static void
printadjacencylist(LinkedList > adj)
{
for (int i = 0; i < adj.size(); ++i) {
// Printing the head
System.out.print(i + "->");
for (int v : adj.get(i)) {
// Printing the nodes
System.out.print(v + " ");
}
// Now a new lin eis needed
System.out.println();
}
}
// Method 3
// Main driver method
public static void main(String[] args)
{
// Creating vertex
int V = 5;
LinkedList > adj
= new LinkedList >();
for (int i = 0; i < V; ++i) {
adj.add(new LinkedList());
}
// Inserting nodes
// Custom input node elements
addEdge(adj, 0, 1);
addEdge(adj, 0, 4);
addEdge(adj, 1, 2);
addEdge(adj, 1, 3);
addEdge(adj, 1, 4);
addEdge(adj, 2, 3);
addEdge(adj, 3, 4);
// Printing adjacency list
printadjacencylist(adj);
}
}
Java
// Java Program to Implement the Directed Graph
// Using Linked List
// Importing standard classes from respectively packages
import java.io.*;
import java.util.*;
// Main class
class GFG {
// Method 1
// To make pair of nodes
static void
addEdge(LinkedList > Adj, int u,
int v)
{
// Creating unidirectional vertex
Adj.get(u).add(v);
}
// Method 2
// To print the adjacency List
static void
printadjacencylist(LinkedList > adj)
{
for (int i = 0; i < adj.size(); ++i) {
// Printing the head
if (adj.get(i).size() != 0) {
System.out.print(i + "->");
for (int v : adj.get(i)) {
// Printing the nodes
System.out.print(v + " ");
}
// A new line is needed
System.out.println();
}
}
}
// Method 3
// Main driver method
public static void main(String[] args)
{
// Creating vertex
int V = 5;
LinkedList > adj
= new LinkedList >();
for (int i = 0; i < V; ++i) {
adj.add(new LinkedList());
}
// Inserting nodes
// Custom input elements
addEdge(adj, 0, 1);
addEdge(adj, 0, 4);
addEdge(adj, 1, 2);
// Printing adjacency List
printadjacencylist(adj);
}
}
输出
0->1 4
1->0 2 3 4
2->1 3
3->1 2 4
4->0 1 3
现在跳到下一种类型的图,即我们使用 Linked List 的有向图表示。在有向图中,两个节点在单向顶点上连接。
示例 2
Java
// Java Program to Implement the Directed Graph
// Using Linked List
// Importing standard classes from respectively packages
import java.io.*;
import java.util.*;
// Main class
class GFG {
// Method 1
// To make pair of nodes
static void
addEdge(LinkedList > Adj, int u,
int v)
{
// Creating unidirectional vertex
Adj.get(u).add(v);
}
// Method 2
// To print the adjacency List
static void
printadjacencylist(LinkedList > adj)
{
for (int i = 0; i < adj.size(); ++i) {
// Printing the head
if (adj.get(i).size() != 0) {
System.out.print(i + "->");
for (int v : adj.get(i)) {
// Printing the nodes
System.out.print(v + " ");
}
// A new line is needed
System.out.println();
}
}
}
// Method 3
// Main driver method
public static void main(String[] args)
{
// Creating vertex
int V = 5;
LinkedList > adj
= new LinkedList >();
for (int i = 0; i < V; ++i) {
adj.add(new LinkedList());
}
// Inserting nodes
// Custom input elements
addEdge(adj, 0, 1);
addEdge(adj, 0, 4);
addEdge(adj, 1, 2);
// Printing adjacency List
printadjacencylist(adj);
}
}
输出
0->1 4
1->2
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。